我试图将调度任务的返回值传递给匿名类,但是我遇到了麻烦。如果我将返回值设置为最终变量,则表示它未初始化:
/* 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);
如何将返回的值传递给代码中的匿名类?
答案 0 :(得分: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.value
中的run
仍可能是null
,具体取决于runTaskTimer
实际执行runnable的时间。
答案 1 :(得分:1)
我的想法,可能听起来很愚蠢,就是创建一个全局变量,并为其指定返回值。然后,有一个静态方法,可以在匿名类中将此值返回给您。
答案 2 :(得分: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);
答案 3 :(得分:0)
我不确定你想做什么。 Callable
代替Runnable
会解决问题吗? http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Callable.html
答案 4 :(得分: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]);
}