Java 是否有一个';适当的';避免';必须是最终的';错误?

Java 是否有一个';适当的';避免';必须是最终的';错误?,java,compiler-errors,Java,Compiler Errors,我想写一个这样的循环: ArrayList<Thread> threads = new ArrayList<>(); for(int i = 0; i < THREADS_TOTAL; i++) { threads.add(new Thread() { @Override public void run(){ foo(i); } }); // more code } A

我想写一个这样的循环:

ArrayList<Thread> threads = new ArrayList<>();
for(int i = 0; i < THREADS_TOTAL; i++) {
    threads.add(new Thread() {
        @Override
        public void run(){
            foo(i);
        }
    });
    // more code
}
ArrayList threads=new ArrayList();
对于(int i=0;i
但我得到了一个编译器错误

在封闭范围中定义的局部变量必须是final或 实际上是最终的

有没有办法避免此错误,特别是当所讨论的变量是基元类型,并且匿名类无论如何都不应该看到更改时?我考虑的选项有:

  • 在循环外定义命名类并将
    i
    传递到构造函数中。我不喜欢这个选项,因为它会创建不必要的间接寻址,而且这是在创建单元测试的上下文中,所以我最终会得到很多额外的内部类,每种情况一个
  • 使用IntStream、forEach和lambdas。由于
    //更多的代码
    ,此操作不起作用
  • 创建另一个变量,如
    intj=i
    在循环中,并在匿名类中使用
    j
    。到目前为止,这似乎是最“干净”的选项,但我仍然不喜欢它,因为这一行没有语义意义,它只是为了安抚编译器

  • 最直接的方法是:

    ArrayList<Thread> threads = new ArrayList<>();
    for(int i = 0; i < THREADS_TOTAL; i++) {
        final int good_name = i;
        threads.add(new Thread(() -> foo(good_name)));
        // more code
    }
    
    ArrayList threads=new ArrayList();
    对于(int i=0;ifoo(好名字));
    //更多代码
    }
    
    简明扼要