在内部 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());
});
});
在制作 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());
});
});