为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

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);}


查看完整回答
反对 回复 2019-05-28
?
隔江千里

TA贡献1906条经验 获得超10个赞

在使用匿名类时,您只能从包含类访问最终变量。因此,您需要声明最终使用的变量(由于您要更改lastPriceprice,因此不适合您),或者不使用匿名类。

因此,您可以选择创建一个实际的内部类,您可以在其中传递变量并以正常方式使用它们

要么:

对你的lastPriceprice变量有一个快速(在我看来很丑陋)的黑客攻击,这就是声明它如此

final double lastPrice[1];final double price[1];

在您的匿名类中,您可以像这样设置值

price[0] = priceObject.getNextPrice(lastPrice[0]);System.out.println();lastPrice[0] = price[0];


查看完整回答
反对 回复 2019-05-28
?
汪汪一只猫

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 );
    }}

似乎你可以做一个比这更好的设计,但想法是你可以将更新的变量分组到一个不会改变的类引用中。


查看完整回答
反对 回复 2019-05-28
  • 4 回答
  • 0 关注
  • 871 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信