Java如何从本地内部类访问数据

时间:2018-09-25 11:20:50

标签: java

下面的代码是一些与我要实现的示例类似的示例。我必须存储内部类中的数据,但是编译器抱怨如下:

  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);
          }
      }

如何将重写方法中的值存储在内部类中?

3 个答案:

答案 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);
          }
    }
    // [...]