我有一个关于修饰符“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;
}
}
如果你们知道导致这种情况或我如何解决这个问题,请帮忙。
提前感谢!
答案 0 :(得分:2)
无法修改最终变量。这(基本上)是final的定义。
您无法更改参考,但您可以改变对象。但是,如果您在此处long
,则会创建一个新的long
,并将其分配给firstTime
的值,该值正在尝试更改引用,从而非法。
答案 1 :(得分:1)
最终变量只能在构造函数中或在声明时通过初始化程序分配。
答案 2 :(得分:1)
此SO Q& A解释了删除final
修饰符时出现的编译错误:
在您的示例中,firstTime
变量看到的run()
实际上是封闭类中firstTime
变量的副本。 final
需要保留只有一个变量的错觉......
将firstTime
声明移动到run()
方法的解决方案很好,但确实会改变行为。该变量现在设置为任务开始运行的时间,之前已将其设置为任务计划的时间。
最后,如果您真的希望run()
方法能够更新封闭范围中的firstTime
变量,那么您将需要以其他方式执行此操作。这种最简单的方法是使firstTime
成为实例变量,而不是局部变量。然后,您可以删除final
,run()
方法可以直接更新变量。
答案 3 :(得分:0)
喜欢
WorldTasksManager.schedule(new WorldTask() {
@Override
public void run() {
long firstTime = System.currentTimeMillis();
if (System.currentTimeMillis() >= firstTime) {
stop();
} else {
firstTime += 5;
}
}