4 回答

TA貢獻(xiàn)1801條經(jīng)驗(yàn) 獲得超16個(gè)贊
為避免奇怪的副作用,由匿名委托引用的java變量中的閉包必須標(biāo)記為final,因此要lastPrice
在計(jì)時(shí)器任務(wù)中引用和定價(jià),需要將它們標(biāo)記為final。
這顯然不適合你,因?yàn)槟阆敫淖兯鼈?,在這種情況下你應(yīng)該考慮將它們封裝在一個(gè)類中。
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; }}
現(xiàn)在只需創(chuàng)建一個(gè)新的Foo作為final,并從計(jì)時(shí)器調(diào)用.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貢獻(xiàn)1906條經(jīng)驗(yàn) 獲得超10個(gè)贊
在使用匿名類時(shí),您只能從包含類訪問最終變量。因此,您需要聲明最終使用的變量(由于您要更改lastPrice和price,因此不適合您),或者不使用匿名類。
因此,您可以選擇創(chuàng)建一個(gè)實(shí)際的內(nèi)部類,您可以在其中傳遞變量并以正常方式使用它們
要么:
對(duì)你的lastPrice和price變量有一個(gè)快速(在我看來很丑陋)的黑客攻擊,這就是聲明它如此
final double lastPrice[1];final double price[1];
在您的匿名類中,您可以像這樣設(shè)置值
price[0] = priceObject.getNextPrice(lastPrice[0]);System.out.println();lastPrice[0] = price[0];

TA貢獻(xiàn)1898條經(jīng)驗(yàn) 獲得超8個(gè)贊
很好的解釋為什么你不能做你想要做的事已經(jīng)提供。作為解決方案,可以考慮:
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 ); }}
似乎你可以做一個(gè)比這更好的設(shè)計(jì),但想法是你可以將更新的變量分組到一個(gè)不會(huì)改變的類引用中。
添加回答
舉報(bào)