我需要在我的runnable中有一个计数器,我尝试写一些看起来像
的东西public class Foo {
private class Bar {
public void barMethod() {
int counter = 0;
Bar instance = this;
BukkitTask barTask = new BukkitRunnable() {
@Override
public void run() {
if (counter == 5) {
this.cancel();
return;
}
instance.doStuff(); // don't worry it exists
counter++;
}
}.runTaskTimer(this.plugin, 0L, 2L);
}
}
}
但是,尝试编译它会导致错误
local variables referenced from an inner class must be final or effectively final
所以我看到问题是我尝试从runnable中更新counter
变量。
但是,这让我对如何在runnable上设置一个计数器毫无头绪。
如何确保runnable最多只运行5次?
答案 0 :(得分:1)
您可以通过以下方式解决此错误:
public class Foo {
private class Bar {
public void barMethod() {
Bar instance = this;
BukkitTask barTask = new BukkitRunnable() {
int counter = 0;
@Override
public void run() {
if (counter == 5) {
this.cancel();
return;
}
instance.doStuff(); // don't worry it exists
counter++;
}
}.runTaskTimer(this.plugin, 0L, 2L);
}
}
}
此致
答案 1 :(得分:0)
标准解决方法是使用单元素数组替换:
public class Foo {
private class Bar {
public void barMethod() {
int[] counter = new int[] { 0 };
Bar instance = this;
BukkitTask barTask = new BukkitRunnable() {
@Override
public void run() {
if (counter[0] == 5) {
this.cancel();
return;
}
instance.doStuff(); // don't worry it exists
counter[0]++;
}
}.runTaskTimer(this.plugin, 0L, 2L);
}
}
}
变量本身永远不会被重新分配,所以它实际上是最终的。