需要从实现java.util.Timer的方法返回一个值

时间:2014-09-08 13:00:39

标签: java timer timertask

我想从下面的方法返回布尔值,但它给出了错误信息

"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;
}

3 个答案:

答案 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代替TimeTaskScheduledExecutorService而不是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等。