非常简单的最终修饰符和运行方法问题

时间:2012-08-18 00:15:18

标签: java

我有一个关于修饰符“final”和run()方法中使用的var的简单问题。这是我的一些代码,但其他方法不起作用。我想它不能添加到firstTime var,我不确定这是因为你不能用最终修饰符做这个或者如果java只是讨厌我:/

final long firstTime = System.currentTimeMillis();

WorldTasksManager.schedule(new WorldTask() {
@Override
public void run() {
    if (System.currentTimeMillis() >= firstTime) {
        stop();
    } else {
    firstTime += 5;
    }
}

如果你们知道导致这种情况或我如何解决这个问题,请帮忙。

提前感谢!

4 个答案:

答案 0 :(得分:2)

无法修改最终变量。这(基本上)是final的定义。

您无法更改参考,但您可以改变对象。但是,如果您在此处long,则会创建一个新的long,并将其分配给firstTime的值,该值正在尝试更改引用,从而非法。

答案 1 :(得分:1)

最终变量只能在构造函数中或在声明时通过初始化程序分配。

答案 2 :(得分:1)

此SO Q& A解释了删除final修饰符时出现的编译错误:

在您的示例中,firstTime变量看到的run()实际上是封闭类中firstTime变量的副本final需要保留只有一个变量的错觉......

firstTime声明移动到run()方法的解决方案很好,但确实会改变行为。该变量现在设置为任务开始运行的时间,之前已将其设置为任务计划的时间。

最后,如果您真的希望run()方法能够更新封闭范围中的firstTime变量,那么您将需要以其他方式执行此操作。这种最简单的方法是使firstTime成为实例变量,而不是局部变量。然后,您可以删除finalrun()方法可以直接更新变量。

答案 3 :(得分:0)

喜欢

WorldTasksManager.schedule(new WorldTask() {
@Override
public void run() {
    long firstTime = System.currentTimeMillis();
    if (System.currentTimeMillis() >= firstTime) {
        stop();
    } else {
    firstTime += 5;
    }
}