私はJavaの単一のメソッドで特定のアルゴリズムを実装しています。このアルゴリズムには、他では使用されないデータ構造が必要なので、ローカルクラスを使用するのが適切だと思います。アルゴリズムの最後のステップでは、メソッドの前半で作成されたすべてのオブジェクトを反復処理する必要があるため、ローカルクラスのコンストラクターに、新しく作成されたオブジェクトをリストに追加させると思いました。Javaでは、ローカルクラスは宣言されたローカル変数にアクセスできますfinal
。だから私はこのようなことを試みました:
public void doThing() {
class Foo {
public Foo() {
fooList.add(this); // FAILS: "cannot find symbol: variable fooList"
}
}
final ArrayList<Foo> fooList = new ArrayList<Foo>();
// algorithm goes here, instantiating some Foo objects:
Foo foo = new Foo();
// etc.
// now iterate through all the Foo objects that were created
for (Foo f : fooList)
System.out.println(f);
}
fooList
ローカルクラス内で参照する前に宣言する必要があるため、これは失敗します。さて、大丈夫、私は思った、私はfooList
メソッドの最初に宣言するだけです:
public void doThing() {
final ArrayList<Foo> fooList; // FAILS: "cannot find symbol: class Foo"
class Foo {
public Foo() {
fooList.add(this);
}
}
fooList = new ArrayList<Foo>();
Foo foo = new Foo();
for (Foo f : fooList)
System.out.println(f);
}
しかし、これも失敗しますFoo
。参照する前にクラスを定義する必要があるようです。では、どうすればこの循環依存を解消できますか?