自分自身を自動的に作成するサブクラスを作成しようとしています。私はインスタンスのリストを保持するBase
を定義しました。次に、固定メンバーreg
でDerived
を定義しました。 reg
は、Base.Register()
を呼び出して初期化され、インスタンスリストに追加されます。Javaで自動初期化された静的オブジェクトを作成する
main()
では、インスタンスリストBase
を印刷しています。しかし、初期化はなく、エラーが発生します - インスタンスリストはnull
です。
Booleans
のリストをBase
に追加しました。インスタンスを登録するたびに、このリストを変更しています。私はまた、このリストをプログラムに印刷します。私はBase.register()
の実行を強制することを期待していたが、役に立たなかった。
私はうまくいきましたが、私は感謝しません - Base.register()
の結果をDerived
に保存して印刷できました。それは静的な初期化を強制するでしょう。しかし、私は派生クラスの束のためのソリューションを使用するつもりで、私はそれぞれの派生クラスを直接呼び出す必要はありません。
静的なinitを強制する方法はありますか?
私は反射を使うことができると思いますが、私は現時点でそれを避けようとしています。
私が実際にやろうとしているのは、(ユニットテストのための)派生クラスのセットを構築することです。すべてのクラスはBase
を派生します。それぞれ別々にインスタンスを作成する必要性を避けたい。私は、各派生クラスコード(のみ)で汎用ソリューションを取得しようとしています。このようなソリューションは、&ペーストを簡単にコピーできます。
public class StaticTest {
private static class Base{
private static ArrayList<Base> _instances = null;
private static ArrayList<Boolean> _regs = null;
public static int _count = 0;
public static void init(){
_regs = new ArrayList<>();
for (int i=0;i<10;i++)
_regs.add(false);
}
protected static boolean register(Base b)
{
if (_instances == null)
_instances = new ArrayList<>();
_regs.set(_count++, true);
return _instances.add(b);
}
public static void printAll(){
for (Boolean b: _regs)
System.out.printf("hello %s%n", b.toString());
for (Base b: _instances)
System.out.printf("hello %s%n", b.toString());
}
}
private static class Derived extends Base{
public static boolean _reg = Base.register(new Derived());
}
public static void main(String[] args) {
//System.out.print(Derived._reg ? "0" : "1");
Base.init();
System.out.printf("Base._count = %d%n",Base._count);
Base.printAll();
}
}
静的初期化ブロックでクラスを初期化することができます。https://stackoverflow.com/questions/2420389/static-initialization-blocks – Rjiuk
「Base」コンストラクタで各オブジェクトを登録し、派生インスタンスを作成してクライアントクラスとして登録されている必要がありますか? –
編集後も、間違った質問をしています。これはあなたの問題ではなく、あなたが適用しようとしている解決策の問題です。これは間違っています。あなたは子供クラスのシングルトンを望みますか?なぜ親は子のシングルトンへの参照を必要としますか?それは理にかなっていませんが、子の参照を親コンストラクタに保存しないでください(親と子は同じインスタンスです)。 –