内部类非最终变量java

Aar*_*erg 8 java final local-variables inner-classes

我需要更改内部类中的变量,并且我得到了臭名昭着的"不能引用在不同方法中定义的内部类中的非final变量"错误.

void onStart(){
  bt.setOnClickListener(new View.OnClickListener() {
     public void onClick(View v) {
       int q = i;
     }
  });
}
Run Code Online (Sandbox Code Playgroud)

我很快创建了一个包含我想要改变的所有内容的类,并在内部类之外创建了类的最终版本

class temp{
  int q;
}

void onStart(){
  final temp x = new temp();
  bt.setOnClickListener(new View.OnClickListener() {
     public void onClick(View v) {
       x.q = i;
     }
  });
}
Run Code Online (Sandbox Code Playgroud)

这似乎是我需要的,它的工作原理,但我想知道这是如何正确解决问题.另外,我真的很讨厌使用这个词temp来命名我的课程.是否有一个实际的编程术语,以便我为我的课程创建一个更具描述性的名称?

Rob*_*bin 9

您可以简单地创建一个内部类而不是匿名类(就像您当前正在做的那样).然后你有一个构造函数和你想要设置你的成员的任何其他方法.不需要任何黑客(如1个案例的数组).

如果班级要求与其外部班级进行任何数据交换,我会发现这个更清洁,但承认这是个人偏好.1个成语的数组也会起作用,而且更简洁,但坦率地说,它看起来很难看.我通常将匿名内部类限制为仅执行操作而不尝试更新外部类中的数据的内部类.

例如:

private MyListener listener = new MyListener();

void onStart(){
  bt.setOnClickListener(listener);
}

class MyListener implements OnClickListener
{ 
    String name;
    int value;

    void setName(String newName)
    {
        name = newName;
    }

    void setValue(int newValue)
    {
        value = newValue;
    }

    public void onClick(View v) 
    {
        // Use the data for some unknown purpose
    }
}
Run Code Online (Sandbox Code Playgroud)

如果涉及多个线程,则还必须使用适当的同步.