【问题标题】:Java How to access data from local inner classJava如何从本地内部类访问数据
【发布时间】:2018-09-25 11:20:49
【问题描述】:

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

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

如何将被覆盖方法的值存储在内部类中?

【问题讨论】:

标签: java


【解决方案1】:

代码示例中的局部变量是returnedValue。它必须是 final 或 effectively 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&lt;String&gt; returnedValue = Optional.of("")

【讨论】:

【解决方案2】:

您可以使用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);
          }
    }
    // [...]

【讨论】:

  • 因为returnedValue的引用永远不会被修改,只有数组的第一个也是唯一的元素
【解决方案3】:

这与内部类无关,这也发生在 lambda 中,您不能从 lambda 或内部类的范围之外更改 var 的值,否则您可能会出现访问问题和多线程竞争条件,您可以使用解决方法Atomic 家庭课程之一,例如 AtomicReference&lt;T&gt;AtomicInteger 前。 :

    AtomicInteger count = new AtomicInteger(0);
    Runnable r = () -> {
        count.getAndIncrement();
    };
    r.run();
    System.out.println(count);

请注意,我只使用了主线程而不是创建新的主线程来避免竞争条件。

【讨论】:

  • 感谢您的回答,但不幸的是我们正在使用 java 7 。为答案+1
  • @Roxy Atomic 系列在 Java 1.5 中的 Java 中你仍然可以使用它。
猜你喜欢
  • 1970-01-01
  • 2011-07-04
  • 1970-01-01
  • 1970-01-01
  • 2011-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多