不能引用在不同方法中定义的内部类中的非最终变量

问题:

编辑:
我需要更改几个变量的值,因为它们运行几次计时器。我需要通过定时器每次迭代继续更新值。我无法将值设置为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);
}

回答:

Java不支持true closures,即使使用像这样使用的匿名类(new TimerTask() { ... })看起来像是一种闭包。
 编辑See the comments below – the following is not a correct explanation, as KeeperOfTheSoul points out.
这就是为什么它不起作用
变量lastPrice和price是main()方法中的局部变量。您使用匿名类创建的对象可能会持续到main()方法返回。
main()方法返回时,局部变量(如lastPriceprice)将从堆栈中清除,因此在main()返回后它们将不再存在。
但匿名类对象引用这些变量。如果匿名类对象在清除后尝试访问变量,那么事情会变得非常错误。
通过使lastPriceprice final,它们不再是真正的变量,而是常量。然后,编译器可以用匿名类中的lastPriceprice替换常量的值(在编译时,当然),你不会再有访问不存在的变量的问题了。
支持闭包的其他编程语言通过特别处理这些变量来做到这一点 – 确保在方法结束时不会被破坏,这样闭包仍然可以访问变量。
@Ankur:你可以这样做:

public static void main(String args[]) {
    int period = 2000;
    int delay = 2000;

    Timer timer = new Timer();

    timer.scheduleAtFixedRate(new TimerTask() {
        // Variables as member variables instead of local variables in main()
        private double lastPrice = 0;
        private Price priceObject = new Price();
        private double price = 0;

        public void run() {
            price = priceObject.getNextPrice(lastPrice);
            System.out.println();
            lastPrice = price;
        }
    }, delay, period);      
}

 
 
Code问答: http://codewenda.com/topics/python/
Stackoverflow: Cannot refer to a non-final variable inside an inner class defined in a different method

*转载请注明本文链接以及stackoverflow的英文链接

发表评论

电子邮件地址不会被公开。 必填项已用*标注

60 − = 51