0

我正在Java中使用单一方法实现特定算法。这个算法需要一个不会在其他地方使用的数据结构,所以我认为适合使用本地类。算法的最后一步需要遍历方法中早先创建的所有对象,所以我认为我会让本地类的构造函数将新创建的对象添加到列表中。在Java中,本地类可以访问声明为final的局部变量。所以,我想是这样的:Java:在参数化类型中使用本地类作为本地类中引用的局部变量

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之前我提到它。那么如何打破这种循环依赖?

+0

如果您正在创建方法内部的类并使用该类的列表,那么您的设计就是错误的。也许你应该添加一个外部类来做到这一点。这听起来像是1000行方法的开始...... –

回答

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);并且引用将在列表中,但是您不在方法中保存引用。这取决于你想做什么,所以使用最舒适的变种

+0

你可以给列表的构造函数。或者调用'fooList.add(foo);'在'doThing()' – alaster

+0

中没有必要将'class'放在本地,这是没有意义的。但ArrayList必须是统一的。我编辑了我的答案 – alaster

+0

你说得对,我也可以将'fooList'作为参数传递给构造函数;这是一个好主意。感觉就像本地类能够访问局部变量的目的是让你不必这样做,但是很好。 –

2

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

我强烈建议只是将本地类拆分为私有静态嵌套类。我不能说我有有史以来看到一个愉快的使用方法内声明的命名类。虽然我普遍赞扬“它只用于一种方法”的部分,但在您宣布课程时,该方法已经达到中等长度,即长度。

当然,你总是可以使用一个原始类型的声明,只是后来......可能会工作,但显然这将是可怕的。

+0

我认为使用本地类很有用的原因之一是'Foo'中的方法需要在'doThing()'方法中使用四个局部变量(其中之一是'fooList',但还有其他三个)。我可以将所有这四个参数作为参数传递给需要它们的每种方法,但我认为我可以通过使用本地类避免这种迂回情绪。也许不是,但? –

+0

@BrianKell:听起来你的方法有太多的工作。你能不能将它们传递给类的构造函数,并给这个类一个方法来处理它们? –

相关问题