不能引用在不同方法中定义的内部类中的非final变量编辑:我需要更改几个变量的值,因为它们通过计时器运行几次。我需要通过计时器每次迭代不断更新值。我无法将值设置为final,因为这会阻止我更新值,但是我收到了我在下面的初始问题中描述的错误:我以前写过以下内容:我收到错误“不能引用在不同方法中定义的内部类中的非final变量”。这种情况发生在双重调用价格和价格调用priceObject上。你知道我为什么会遇到这个问题。我不明白为什么我需要最后的声明。此外,如果你能看到我想要做的是什么,我该怎么做才能解决这个问题。public static void main(String args[]) {
int period = 2000;
int delay = 2000;
double lastPrice = 0;
Price priceObject = new Price();
double price = 0;
Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
public void run() {
price = priceObject.getNextPrice(lastPrice);
System.out.println();
lastPrice = price;
}
}, delay, period);}
4 回答
侃侃尔雅
TA贡献1801条经验 获得超15个赞
为避免奇怪的副作用,由匿名委托引用的java变量中的闭包必须标记为final,因此要lastPrice
在计时器任务中引用和定价,需要将它们标记为final。
这显然不适合你,因为你想改变它们,在这种情况下你应该考虑将它们封装在一个类中。
public class Foo { private PriceObject priceObject; private double lastPrice; private double price; public Foo(PriceObject priceObject) { this.priceObject = priceObject; } public void tick() { price = priceObject.getNextPrice(lastPrice); lastPrice = price; }}
现在只需创建一个新的Foo作为final,并从计时器调用.tick。
public static void main(String args[]){ int period = 2000; int delay = 2000; Price priceObject = new Price(); final Foo foo = new Foo(priceObject); Timer timer = new Timer(); timer.scheduleAtFixedRate(new TimerTask() { public void run() { foo.tick(); } }, delay, period);}
隔江千里
TA贡献1906条经验 获得超10个赞
在使用匿名类时,您只能从包含类访问最终变量。因此,您需要声明最终使用的变量(由于您要更改lastPrice和price,因此不适合您),或者不使用匿名类。
因此,您可以选择创建一个实际的内部类,您可以在其中传递变量并以正常方式使用它们
要么:
对你的lastPrice和price变量有一个快速(在我看来很丑陋)的黑客攻击,这就是声明它如此
final double lastPrice[1];final double price[1];
在您的匿名类中,您可以像这样设置值
price[0] = priceObject.getNextPrice(lastPrice[0]);System.out.println();lastPrice[0] = price[0];
汪汪一只猫
TA贡献1898条经验 获得超8个赞
很好的解释为什么你不能做你想要做的事已经提供。作为解决方案,可以考虑:
public class foo{ static class priceInfo { public double lastPrice = 0; public double price = 0; public Price priceObject = new Price (); } public static void main ( String args[] ) { int period = 2000; int delay = 2000; final priceInfo pi = new priceInfo (); Timer timer = new Timer (); timer.scheduleAtFixedRate ( new TimerTask () { public void run () { pi.price = pi.priceObject.getNextPrice ( pi.lastPrice ); System.out.println (); pi.lastPrice = pi.price; } }, delay, period ); }}
似乎你可以做一个比这更好的设计,但想法是你可以将更新的变量分组到一个不会改变的类引用中。
添加回答
举报
0/150
提交
取消