在制作一个我遇到的Android应用程序时遇到了关于从内部类访问非最终变量的问题。使用This作为参考。
我想问一下"适当的"有效的方法来做到这一点? 我的两个解决方案如下:
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
}
});
}
OR
for (final Button b : buttonArray) {...}
//请随意提出更好的方法。我将尝试使用lambda表达式来美化代码
答案 0 :(得分:1)
这之间没有性能差异:
alphabet =['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z']
key = ''
for a in range(26):
key += alphabet[a]
print(key)
key = ''
for a in range(26):
for b in range(26):
key += alphabet[a]+ alphabet[b]
print(key)
key = ''
for a in range(26):
for b in range(26):
for c in range(26):
key += alphabet[a]+ alphabet[b]+ alphabet[c]
print(key)
key = ''
和此:
for (Button b : buttonArray) {
final Button bb = b;
...
...
但是,我建议使用第二种方法,因为我将其视为 redundancy ,以创建一个新变量,该变量指向内存中与您随后操作的迭代变量相同的对象。
此外,使用lambdas可以使用以下代码清理代码:
for (final Button b : buttonArray) {...}
请注意,在这种情况下,我们甚至不需要将迭代变量声明为 final ,因为它已经满足有效的最终规则。
另外,您可以使用流转换整个代码:
for (Button b : buttonArray) {
b.addActionListener(v -> {
text.append(b.getText().toString());
});
}
答案 1 :(得分:0)
我认为你不会问任何关于' final'关键字的工作原理是foreach循环的工作原理。 只要foreach循环工作一次只需要一个实例,你的声明应该同样有效。