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

那么如何打破这种循环依赖呢?

我强烈建议将本地类分解为私有静态嵌套类。我不能说我见过在方法中声明的命名类的愉快使用。虽然我通常对“它仅用于一种方法”部分表示赞赏,但当您声明该类时,该方法已经达到中等长度。

当然,您总是可以使用原始类型进行声明,然后再进行转换......这可能会起作用,但显然它会很糟糕。

于 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 回答