作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我需要更改内部类中的变量,但我遇到了臭名昭著的“无法引用在不同方法中定义的内部类中的非最终变量”错误。
void onStart(){
bt.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
int q = i;
}
});
}
我很快创建了一个包含所有我想要更改的内容的类,并在内部类之外创建了该类的最终版本
class temp{
int q;
}
void onStart(){
final temp x = new temp();
bt.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
x.q = i;
}
});
}
这似乎是我需要的并且它有效,但我想知道这是否是正确解决问题的方法。另外,我真的很讨厌用 temp
这个词来命名我的类(class)。我所做的是否有一个实际的编程术语,以便我为我的类(class)取一个更具描述性的名称?
最佳答案
您可以简单地创建一个内部类而不是匿名类(就像您目前正在做的那样)。然后你有一个构造函数和任何其他你想设置你的成员的方法。不需要 hackiness(如 1 个案例的数组)。
如果类需要与其外部类进行任何数据交换,我会发现这样更干净,但承认这是个人偏好。 array of 1 idiom 也可以工作并且更简洁,但坦率地说,它看起来很丑。我通常将匿名内部类限制为那些只执行操作而不尝试更新外部类中的数据的内部类。
例如:
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
}
}
如果涉及多个线程,则还必须使用适当的同步。
关于java - 内部类非final变量java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11316954/
我是一名优秀的程序员,十分优秀!