内循环中使用过的变量问题。
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
)使用此计时器。
如何在内循环中初始化变量?
答案 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对象进行归零。
访问内部类中的变量需要它们是最终的,以确保它们不会在内部类之外进行更改。
如前所述,您可以使用AtomicReference
或ObjectProperty
。 (尽管我在你的例子中没有找到原因)
答案 3 :(得分:0)
您需要模拟AtomicReference
或创建一个类来保存变量并封装它。
仿真可以这样完成:http://www.gwtproject.org/doc/latest/DevGuideOrganizingProjects.html(用另一个覆盖一个包实现)。
但是你需要AtomicReference
的源代码,它是JDK的一部分。
在内部,它严重依赖于JDK核心的Unsafe
函数,GWT不支持这些函数。
所以最后你最终可能会创建一个像Manos Nikolaidis提议的简单包装类。