runnable中的计数器'从内部类引用的局部变量必须是最终的或有效的最终'

时间:2018-04-07 22:46:26

标签: java minecraft runnable bukkit

我需要在我的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次?

2 个答案:

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

变量本身永远不会被重新分配,所以它实际上是最终的。