不能引用在不同方法中定義的內部類中的非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
提交
取消
