我想从下面的方法返回布尔值,但它给出了错误信息
"Local variable stopped is access from within inner class;
needs to be declared final."
但如果我宣布停止作为最终,我无法改变它的价值。
我知道这是由于Timer。请指教!
public boolean requestTimer(final Club club,final String msisdn, final int time) {
boolean stopped=false;
new java.util.Timer().schedule(
new java.util.TimerTask() {
@Override
public void run() {
stopped=checkStopped(club,msisdn); //this line has the error
}
}, time);
return stopped;
}
答案 0 :(得分:1)
我知道这是由于Timer
它与Timer无关,而与您尝试在内部类中使用局部变量有关。 Java生成内部类中使用的局部变量的副本,如果原始未声明为final,则两个变量(原始变量和副本)会发生变化。
但是,如果我宣布停止为最终,我就无法改变它的价值。
真。所以你不能这样做。可能的解决方案是您不使用局部变量。而是使用在类中声明的字段。
答案 1 :(得分:1)
您不能从内部类修改局部变量。您可以访问它,但必须声明为final,这样一旦分配就无法更改它。
你可以从内部类修改外部类的字段没问题。将声明移动到字段级别:
boolean stopped=false;
public boolean requestTimer(final Club club,final String msisdn, final int time)
(...)
这将有效。
如果您的任务必须在计划的延迟后运行并返回结果,我建议使用Callable代替TimeTask
和ScheduledExecutorService
而不是Timer
。然后,您将获得将返回所需值的ScheduledFuture
,或者暂停当前线程(如果尚未提供)。
答案 2 :(得分:1)
你可能(ab)使用BooleanHolder:
import org.omg.CORBA.BooleanHolder;
...
final BooleanHolder stopped= new BooleanHolder();
...
stopped.value = checkStopped(club,msisdn);
...
return stopped.value;
因此,你有一个final
的东西,但是有一个可变的值。类似于int等。