クラス A と B があり、クラス A のコンストラクターがプライベートで、B で A のインスタンスを使用したい場合、どうすればよいでしょうか? 「クラス内から作成されたインスタンスへのアクセスを許可する静的メソッドまたは変数を提供する」という回答が表示されますが、それがわかりませんでした。
6 に答える
求めるコード パターンはFactory Methodと呼ばれます。
このクラスは、独自のクラスのインスタンスを返す静的メソッドを提供します。プライベート コンストラクターはクラスのすべてのメソッド (静的メソッドを含む) から見えるため、静的メソッドは呼び出し元に代わってプライベート コンストラクターを呼び出すことができます。
このパターンの実際の例を次に示します。
public class A {
private A() {
}
public static A create() {
return new A();
}
}
これはシングルトン パターンと組み合わせて使用されることが多く、上記の例を次のように変更します。
public class A {
private static A INSTANCE = new A();
private A() {
}
public static A getInstance() {
return INSTANCE;
}
}
Aには、クラスAのインスタンスを提供するパブリックメソッドが必要です。例:
class A {
/*Constructors and other methods omitted*/
public static A getInstance() {
return new A();
}
}
プライベート コンストラクターのみを持つクラスは、他のクラスが直接インスタンス化できないように設計されています。おそらく、これには正当な理由があります。クラスは、クラスをインスタンス化するため、またはクラスの既存のインスタンスを取得するためのファクトリ メソッドを提供する場合があります。
設計を変更する必要がある場合、最善の方法はクラスを変更することです。たとえば、コンストラクタを可視にするか、ファクトリ メソッドを追加します。それができない場合は、リフレクションを使用して可視性ルールを破り、プライベート コンストラクターを使用してインスタンスを作成することも可能だと思います。ただし、これは最後の手段としてのみ行います...アプリケーション全体の結果を注意深く分析する前ではありません。
Alternatively, if B is an inner class of A (or vice-versa), then B can directly reference the constructor eg:
public class A {
private A() {}
public static class B {
private A instanceOfA = new A();
public B() {}
}
}
例として、クラスを参照してくださいCalendar
。インスタンスを取得するには、そのコンストラクターを呼び出すのではなく、静的メソッドを使用する必要があります。
Calendar rightNow = Calendar.getInstance();
プライベート コンストラクターは、クラスがインスタンスを持たないようにすることを目的としています。ただし、 super()を使用して子クラスからコンテンツにアクセスできます。実装は次のようになります。
public class ClassA {
プライベート int val;
プライベート ClassA(int val)
{this.val = val;
}
public int getVal() { return val;
}
}
public class ClassB extends ClassA {
public ClassB(int val) {スーパー(val); } }
...
ClassB b = 新しい ClassB(4);
System.out.println("b の値:" + b.getVal());