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

不能引用在不同方法中定义的内部类中的非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);}


慕的地10843
浏览 881回答 4
4回答

侃侃尔雅

为避免奇怪的副作用,由匿名委托引用的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);}

隔江千里

在使用匿名类时,您只能从包含类访问最终变量。因此,您需要声明最终使用的变量(由于您要更改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];

汪汪一只猫

很好的解释为什么你不能做你想要做的事已经提供。作为解决方案,可以考虑: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 );     }}似乎你可以做一个比这更好的设计,但想法是你可以将更新的变量分组到一个不会改变的类引用中。
打开App,查看更多内容
随时随地看视频慕课网APP