假設我有3個類 class1
,class2
和class3
。只能從特定類實例化的類
我怎樣才能讓class1
只能被class2
(class1 object = new class1()
)實例化,但不能被class3或任何其他類實例化?
我認爲它應該與修飾符一起工作,但我不確定。
假設我有3個類 class1
,class2
和class3
。只能從特定類實例化的類
我怎樣才能讓class1
只能被class2
(class1 object = new class1()
)實例化,但不能被class3或任何其他類實例化?
我認爲它應該與修飾符一起工作,但我不確定。
更新
使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
}
}
爲什麼不使用包私有構造函數? –
我不同意這個答案。如果構造函數是受保護的,那意味着擴展它的類仍然可以調用構造函數。 –
@Marko請參閱更新,謝謝 –
除了使構造另一種選擇保護:
class1
建築工專用class2
序的有效實例返回class1
製作class1的內部類class2的實例的公共靜態工廠方法。
我想將您的類重命名爲Friend
,Shy
和Stranger
。 Friend
應該能夠創建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當你想到它時。僅僅因爲我是某人的朋友並不意味着我的孩子知道他們。
請注意,所有這些類都在同一個包中。據我所知,這是你正在尋找的場景。
您是否需要'class1'才能被其他類訪問,只是無法實例化? –