0

私は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。参照する前にクラスを定義する必要があるようです。では、どうすればこの循環依存を解消できますか?

4

2 に答える 2

2

では、この循環依存を解消するにはどうすればよいでしょうか。

ローカル クラスをプライベートな静的ネスト クラスに分割することを強くお勧めします。メソッド内で宣言された名前付きクラスの快適な使用法を見たことがないとは言えません私は通常、「1 つのメソッドでのみ使用される」という部分を称賛しますが、クラスを宣言するまでに、メソッドはすでに中程度の長さになっています。

もちろん、宣言に常に生の型を使用し、後でキャストすることもできます...おそらくうまくいくでしょうが、明らかに恐ろしいことです。

于 2012-06-13T17:23:20.400 に答える
0

別の方法:

class Foo {
    public Foo(ArrayList<Foo> fooList) {
        fooList.add(this);
    }
    public Foo() {
    }
}

public void doThing() {
    final ArrayList<Foo> fooList = new ArrayList<Foo>();

    Foo foo = new Foo(fooList);

    // or simply fooList.add(new Foo());


    for (Foo f : fooList)
        System.out.println(f);
}

このようにリストに参照を追加するのは悪い考えだと思います。この場合、単に書くことができnew Foo(fooList);、参照はリストに含まれますが、メソッドに参照を保存していません。それはあなたが何をしようとしているのかに依存するので、最も快適なバリアントを使用してください

于 2012-06-13T17:21:28.017 に答える