不能引用在不同方法中定義的內部類中的非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條經驗 獲得超16個贊
為避免奇怪的副作用,由匿名委托引用的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
提交
取消