下面的代码是一些与我要实现的示例类似的示例。我必须存储内部类中的数据,但是编译器抱怨如下:
returnedValue=(MyXYZClass)value.toString();
在封闭范围中定义的局部变量selectedBusinessArea必须是最终的或实际上是最终的
private String methodInMainClass(Object someRef){
String returnedValue="";
new SomeInnerClass(Object someRef){
@Override
public String getData(Object value){
if(value instanceof MyXYZClass){
returnedValue=(MyXYZClass)value.toString(); // Not Happening. I cannot assign it to the outer variable.
}
return super.getData(value);
}
}
如何将重写方法中的值存储在内部类中?
答案 0 :(得分:2)
代码示例中的局部变量为returnedValue
。它必须是final或effectively final,但是既没有声明final
也不是有效的final,因为它得到了赋值。
如何解决此问题:
您需要的是final变量或有效地是final变量,可以存储returnedValue
的状态。有很多方法可以做到这一点。
一种方法是定义一个类似BoxedValue
的类。
public class BoxedValue<T> {
private T value;
public void set(T value) {
this.value = value;
}
public T get() {
return value;
}
}
在代码中使用它:
private String methodInMainClass(Object someRef){
BoxedValue<String> returnedValue = new BoxedValue<>("");
new SomeInnerClass(Object someRef){
@Override
public String getData(Object value){
if(value instanceof MyXYZClass){
returnedValue.set((MyXYZClass)value.toString()); // Not Happening. I cannot assign it to the outer variable.
}
return super.getData(value);
}
}
return returnedValue.get();
}
变量returnedValue
现在实际上是最终变量。
如果您不想定义其他类,则可以使用任何其他类来存储状态,即Optional<String> returnedValue = Optional.of("")
。
答案 1 :(得分:1)
这与内部类无关,这也发生在lambda中,您不能从lambda或内部类的范围之外更改var的值,否则您可能会出现访问问题,并且对于多线程竞争条件,您可以使用解决方法其中Atomic
个家庭类之一,例如AtomicReference<T>
或AtomicInteger
。 :
AtomicInteger count = new AtomicInteger(0);
Runnable r = () -> {
count.getAndIncrement();
};
r.run();
System.out.println(count);
请注意,在这里我只使用主线程而不创建新线程来面对竞争状况。
答案 2 :(得分:1)
您可以使用array
来完成技巧
private String methodInMainClass(Object someRef){
String[] returnedValue= {""};
new SomeInnerClass(someRef){
@Override
public String getData(Object value){
if(value instanceof MyXYZClass){
returnedValue[0] = ((MyXYZClass)value).toString(); // Not Happening. I cannot assign it to the outer variable.
}
return super.getData(value);
}
}
// [...]