4

我试图将调度任务的返回值传递给匿名类,但我遇到了麻烦。如果我将返回值设置为最终变量,则表示它未初始化:

/* Not initialized */
final BukkitTask task = Bukkit.getScheduler().runTaskTimer(plugin, new Runnable() {

    public void run() {
        /* irrelevant code */
        task.cancel();
    }

}, 0L, 20L);

我还尝试通过调用匿名类中的方法来传递变量,但是它将返回类型更改为 void,因此我无法传递正确的值:

BukkitTask temp = null;
/* Returns void */
temp = Bukkit.getScheduler().runTaskTimer(plugin, new Runnable() {

    private BukkitTask task;

    public void initTask(BukkitTask task) {
        this.task = task;
    }

    public void run() {
        /* irrelevant code */
        task.cancel();
    }

}.initTask(temp), 0L, 20L);

如何将返回值传递给代码中的匿名类?

4

5 回答 5

3

你可以定义这个类

class Box<T> {
    public volatile T value;
}

并像这样使用它:

final Box<BukkitTask> taskBox = new Box<BukkitTask>();
taskBox.value = Bukkit.getScheduler().runTaskTimer(plugin, new Runnable() {
    public void run() {
        /* irrelevant code */
        taskBox.value.cancel();
    }
}, 0L, 20L);

但是,taskBox.valueinrun仍然可能null取决于runTaskTimer实际执行可运行文件的时间。

于 2013-11-01T14:25:14.683 回答
1

我的想法(听起来可能很愚蠢)是创建一个全局变量,您可以为其分配返回值。然后,有一个静态方法会在匿名类中将此值返回给您。

于 2013-11-01T14:14:54.540 回答
0

我似乎很快就找到了答案!

您可以更改init方法的返回类型,然后它将为代码返回正确的值!:

BukkitTask task = null;
task = Bukkit.getScheduler().runTaskTimer(plugin, new Runnable() {

    private BukkitTask task;

    public Runnable initTask(BukkitTask task) {
        this.task = task;
        return this;
    }

    public void run() {
        /* irrelevant code */
        task.cancel();
    }
}.initTask(task), 0L, 20L);
于 2013-11-01T14:13:40.733 回答
0

我不确定你想做什么。Callable而不是Runnable解决问题?http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Callable.html

于 2013-11-01T14:14:40.320 回答
0

看这个例子

 public static void main(String[] args) {
    final Object objectA[] = new String[1];

    new Thread(new Runnable() {
        private A refA = null;
        public void run() {
            objectA[0] = "Hello World or your object";
        }
    }).start();;

    while (objectA[0] == null){

    }
    System.out.println(objectA[0]);
}
于 2013-11-01T14:19:55.640 回答