と の 3 つのクラス
class1
があるclass2
としclass3
ます。
( )class1
によってのみインスタンス化でき、class3 または他のクラスによってはインスタンス化できないようにするにはどうすればよいですか?class2
class1 object = new class1()
修飾子で動作するはずだと思いますが、よくわかりません。
あなたのクラスの名前を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();
}
}
そして、この命名規則は、よく考えると理にかなっています。私が誰かの友達だからといって、私の子供がその人を知っているとは限りません。
これらのクラスはすべて同じパッケージに含まれていることに注意してください。私が理解できる限り、これはあなたが探しているシナリオです。
コンストラクターを保護する以外の別のオプション:
class1
非公開にするclass2
のインスタンスを返すために有効なインスタンスを必要とする public static factory メソッドを作成します。class1
アップデート
コンストラクターを作成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
}
}
class1 を class2 の内部クラスにします。