Android 当使用foreach循环迭代arraylist以不使实例成为最终实例时,是否有解决方法?

Android 当使用foreach循环迭代arraylist以不使实例成为最终实例时,是否有解决方法?,android,loops,foreach,final,modifier,Android,Loops,Foreach,Final,Modifier,因此,当我遍历我的按钮数组列表时,我试图设置它们的所有onClickedListener()/onFocusChangedListener(),但当涉及到修改或更改数组列表中的按钮时,它告诉我它必须是最终的 代码: 所以它要求它变成这样 for(最终按钮aBtn:菜单按钮) 有人能给我解释一下吗,我现在不是100%的工作,我不明白为什么它必须是最终的 我已经找到了使用其他方法迭代数组列表的其他方法,但这让我感到困扰。final关键字意味着您不能在其范围内更改变量的值。对于循环示例,您可以认为变量

因此,当我遍历我的按钮数组列表时,我试图设置它们的所有onClickedListener()/onFocusChangedListener(),但当涉及到修改或更改数组列表中的按钮时,它告诉我它必须是最终的

代码:

所以它要求它变成这样

for(最终按钮aBtn:菜单按钮)

有人能给我解释一下吗,我现在不是100%的工作,我不明白为什么它必须是最终的


我已经找到了使用其他方法迭代数组列表的其他方法,但这让我感到困扰。

final关键字意味着您不能在其范围内更改变量的值。对于循环示例,您可以认为变量在循环的底部超出范围,然后在循环的顶部返回一个新值。分配给循环中的变量将不起作用。

让我们后退一步,看看这里发生了什么:

  • 您有一个实例变量(按钮aBtn)
  • 您正在内部类(新的OnFocusChangeListener(){…})中引用此实例变量
  • 现在,这里需要记住的是,内部类的方法将在以后的未定义日期被调用。因此,其中包含的方法与当前的执行流是分开的。现在想象一下下面的代码:

       for(Button aBtn : menu_Buttons)
    {
        aBtn.setOnFocusChangeListener(new OnFocusChangeListener(){
    
            @Override
            public void onFocusChange(View arg0, boolean changed) {
                Log.i("LC", "focus changed");
                if(changed)
                 {
                    aBtn.setTextColor(Color.parseColor("#FFFFFF"));
                     Log.i("LC", "true");
                 }
                 else
                 {
                     aBtn.setTextColor(Color.parseColor("#CD6839"));
                     Log.i("LC", "false");
                 }
            }
        });
    
       if(someCondition) {
          aBtn = someOtherButton;
       }
    }
    
    在这种情况下,aBtn发生了变化,那么当调用内部类的一个方法时,内部类应该使用哪个按钮实例呢?无论编译器选择哪一种,都会给程序员带来歧义,这反过来很容易成为微妙且难以追踪的bug的来源


    通过在内部类中引用的实例变量上强制使用final,编译器消除了这种歧义,使编写正确的程序变得更容易。

    我现在明白了,我无法想象它背后更大的含义!谢谢你的信息!
       for(Button aBtn : menu_Buttons)
    {
        aBtn.setOnFocusChangeListener(new OnFocusChangeListener(){
    
            @Override
            public void onFocusChange(View arg0, boolean changed) {
                Log.i("LC", "focus changed");
                if(changed)
                 {
                    aBtn.setTextColor(Color.parseColor("#FFFFFF"));
                     Log.i("LC", "true");
                 }
                 else
                 {
                     aBtn.setTextColor(Color.parseColor("#CD6839"));
                     Log.i("LC", "false");
                 }
            }
        });
    
       if(someCondition) {
          aBtn = someOtherButton;
       }
    }