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

时间:2017-12-10 21:41:21

标签: java android arrays iteration anonymous-inner-class

在制作一个我遇到的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表达式来美化代码

2 个答案:

答案 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循环工作一次只需要一个实例,你的声明应该同样有效。