如何在块内初始化变量?

时间:2015-11-09 10:54:20

标签: java gwt

内循环中使用过的变量问题。

Timer innerTimer = new Timer() {         
      @Override
      public void run() {
        for(final Rectangle rectangle : rectangles) {
          if(stopTimer) {
            this.cancel();
            innerTimer = null; // It shows "Cannot refer to a non-final variable innerTimer inside an inner class defined in a different method"
            break;
          }
        }
      }
    };

如果我将上述代码更改为:

    final Timer innerTimer = new Timer() {         
      @Override
      public void run() {
        for(final Rectangle rectangle : rectangles) {
          if(stopTimer) {
            this.cancel();
            innerTimer = null; // "The final local variable innerTimer cannot be assigned, since it is defined in an enclosing type"
            break;
          }
        }
      }
    };

我在GWT(com.google.gwt.user.client.Timer)使用此计时器。

如何在内循环中初始化变量?

4 个答案:

答案 0 :(得分:3)

您可以包装Timer对象。 E.g。

public class TimerWrap {

    Timer timer = new Timer();

    public void cancel() {
        timer.cancel();
        timer = null;
    }
}

并像这样使用

final TimerWrap innerTimer = new TimerWrap() {
    public void run() {
        for (final Rectangle rectangle : rectangles) {
            if (stopTimer) {
                this.cancel();
                break;
            }
        }
    }
};

答案 1 :(得分:2)

您可以使用AtomicReference

final AtomicReference<Timer> innerTimer = new AtomicReference<>();
innerTimer.set(
  new Timer() {
    @Override public void run() {
      innerTimer.set(null);
    }
  });

答案 2 :(得分:1)

您无法重新设置最终对象。此外,在您的示例中,根本不需要对innerTimer对象进行归零。

访问内部类中的变量需要它们是最终的,以确保它们不会在内部类之外进行更改。

如前所述,您可以使用AtomicReferenceObjectProperty。 (尽管我在你的例子中没有找到原因)

答案 3 :(得分:0)

您需要模拟AtomicReference或创建一个类来保存变量并封装它。

仿真可以这样完成:http://www.gwtproject.org/doc/latest/DevGuideOrganizingProjects.html(用另一个覆盖一个包实现)。 但是你需要AtomicReference的源代码,它是JDK的一部分。 在内部,它严重依赖于JDK核心的Unsafe函数,GWT不支持这些函数。

所以最后你最终可能会创建一个像Manos Nikolaidis提议的简单包装类。