我刚学会了我不能在匿名内部类中使用非最终局部变量,所以当我们需要在不声明即时变量的情况下更改内部类中的值时,是否有任何棘手的方法?
答案 0 :(得分:4)
您无法正常使用它们,在继续操作之前需要考虑这些因素。您将如何处理匿名类的实例?如果它只在本地使用,在该方法的范围内,那么你可以使用这个简单的技巧(假设你有一个int
var):
final int localVar[] = {1};
new AnonymousClass() {
public void method() { localVar[0]++; }
};
如果实例在创建它的方法返回后可以访问,那么您可能会遇到线程安全问题。实例可以传递给其他线程,上面的简单设计不是线程安全的。
答案 1 :(得分:2)
您可以编写自己非常简单的Holder
。
/**
* Make a final one of these to hold non-final things in.
*/
public class Holder <T> {
private T held = null;
public Holder () {
}
public Holder (T it) {
held = it;
}
public void hold(T it) {
held = it;
}
public T held() {
return held;
}
@Override
public String toString () {
return String.valueOf(held);
}
}
请不要使用原子 - 它们有很大的开销。
final Holder<Integer> number = new Holder(0);
... {
number.hold(n);
}
...
return number.held();
答案 2 :(得分:0)
您可以使用此代码段。
void someMethod(){
final AtomicReference<String> var = new AtomicReference<String>("Blah")
foo(new Bar(){
void baz(){
var.set("Blah-blah");
}
});
}