在内部 class 中访问 for 循环变量的最佳实践

best practices for accessing a for loop variable inside an inner class

在制作 android 应用程序时,我遇到了有关从内部 class 访问非最终变量的问题。使用 作为参考。

我想问一下什么是 "proper" 并且有效的方法? 我的两个解决方案如下:

for (Button b : buttonArray) {
      final Button bb = b;
        b.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                text.append(bb.getText().toString());
                //Appending "1".."0" to a textView
            }
        });
    }

 for (final Button b : buttonArray) {...}

//请随时提出更好的方法。后面会尝试使用lambda表达式来美化代码

我认为您不是在问有关 'final' 关键字如何工作的任何问题,而是 foreach 循环如何工作的问题。 只要 foreach 循环通过一次获取一个实例来工作,您的两个声明都应该同样有效。

这之间没有性能差异:

for (Button b : buttonArray) {
      final Button bb = b;
     ...
     ...

还有这个:

for (final Button b : buttonArray) {...}

但是,我推荐第二种方法,因为我认为它是 冗余 创建一个指向内存中与迭代变量相同的对象的新变量,然后操作。

此外,使用 lambda 可以使代码更简洁:

for (Button b : buttonArray) {
     b.addActionListener(v -> {
         text.append(b.getText().toString());
     });
}

请注意,在这种情况下,我们甚至不需要将迭代变量声明为 final,因为它已经满足 effectively final规则。

顺便说一句,您可以使用流转换整个代码:

Arrays.stream(buttonArray).forEach(button -> {
      button.addActionListener(v -> {
           text.append(button.getText().toString());
      });
});