2013-01-16 70 views
2

假設我有3個類 class1,class2class3只能從特定類實例化的類

我怎樣才能讓class1只能被class2class1 object = new class1())實例化,但不能被class3或任何其他類實例化?

我認爲它應該與修飾符一起工作,但我不確定。

+0

您是否需要'class1'才能被其他類訪問,只是無法實例化? –

回答

0

更新

使protected構造函數,並把符合條件的類相同的包,如果你想包外的任何類來構建這種情況下,你需要一個類來在這個例子中延長ClassA

,如果你限制它,然後去default訪問符

package com.somthing.a; 
public class ClassA { 

    ClassA() { 
     super(); 
     // TODO Auto-generated constructor stub 
    } 
} 

package com.something.a; 
public class ClassB { 
    public static void main(String[] args) { 
     new ClassA();//valid 
    } 
} 


package com.something.c; 
public class ClassC { 
    public static void main(String[] args) { 
     new ClassA();// invalid 
    } 
} 
+0

爲什麼不使用包私有構造函數? –

+0

我不同意這個答案。如果構造函數是受保護的,那意味着擴展它的類仍然可以調用構造函數。 –

+0

@Marko請參閱更新,謝謝 –

1

除了使構造另一種選擇保護:

  • 充分利用class1建築工專用
  • 作出這樣的要求class2序的有效實例返回class1
0

製作class1的內部類class2的實例的公共靜態工廠方法。

2

我想將您的類重命名爲Friend,ShyStrangerFriend應該能夠創建Shy,但Stranger應該不能。

這個代碼編譯:

package com.sandbox; 

public class Friend { 

    public void createShy() { 
     Shy shy = new Shy(); 
    } 

    private static class Shy { 

    } 

} 

但這種代碼不會:

package com.sandbox; 

public class Stranger { 

    public void createShy() { 
     Friend.Shy shy = new Friend.Shy(); 
    } 

} 

另外,如果我們創建一個名爲FriendsChild新類,這不會要麼編譯:

package com.sandbox; 

public class FriendsChild extends Friend { 

    public void childCreateShy() { 
     Shy shy = new Shy(); 
    } 

} 

而這個命名約定使sens當你想到它時。僅僅因爲我是某人的朋友並不意味着我的孩子知道他們。

請注意,所有這些類都在同一個包中。據我所知,這是你正在尋找的場景。