0

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

final long firstTime = System.currentTimeMillis();

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

如果你们知道是什么原因造成的或者我该如何解决这个问题,请帮忙。

提前致谢!

4

4 回答 4

2

最终变量无法修改。那就是(本质上)final的定义。

你不能改变引用,但你可以改变对象。但是,在long您在这里遇到的情况下,long会创建一个 new 并将其分配给 的值firstTime,它试图更改引用,因此是非法的。

于 2012-08-18T00:16:57.267 回答
1

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

于 2012-08-18T00:17:31.907 回答
1

此 SO Q&A 解释了您在删除final修饰符时遇到的编译错误:

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

您将声明移动firstTimerun()方法中的解决方案很好,但它确实改变了行为。该变量现在设置为任务开始运行的时间,之前它设置为任务计划的时间。

最后,如果您真的希望该run()方法能够更新firstTime封闭范围内的变量,您将需要以其他方式执行此操作。这种最简单的方法是创建firstTime一个实例变量,而不是局部变量。然后您可以删除final并且该run()方法可以直接更新变量。

于 2012-08-18T01:38:18.167 回答
0

做喜欢

WorldTasksManager.schedule(new WorldTask() {
@Override
public void run() {
    long firstTime = System.currentTimeMillis();
    if (System.currentTimeMillis() >= firstTime) {
        stop();
    } else {
    firstTime += 5;
    }
}
于 2012-08-18T06:57:09.967 回答