Java不支持真正的闭包,即使使用像你在此使用的匿名类
(new TimerTask() { ... })看起来就像一种闭包。编辑 - 请参阅下面的注释-正如
KeeperOfTheSoul所指出的,以下内容不是正确的解释。
这就是为什么它不起作用的原因:
变量
lastPrice和价格是
main()方法中的局部变量。你使用匿名类创建的对象可能会持续到该main()方法返回之后。
当
main()方法返回时,局部变量(如
lastPrice和
price)从栈中清除,因此他们将不再存在后
main()回报。
但是匿名类对象引用了这些变量。如果匿名类对象在清除变量后尝试访问变量,则事情将变得非常糟糕。
通过制作
lastPrice和
price final,它们不再是真正的变量,而是常量。然后,编译器就可以使用常量的值(当然是在编译时)来替换匿名类中
lastPriceand的使用
price(当然是在编译时),并且访问不再存在的变量将不再有问题。
其他支持闭包的编程语言通过特殊对待那些变量来做到这一点-确保方法结束时它们不会被破坏,以便闭包仍然可以访问变量。
你可以这样做:
public static void main(String args[]) { int period = 2000; int delay = 2000; Timer timer = new Timer(); timer.scheduleAtFixedRate(new TimerTask() { // Variables as member variables instead of local variables in main() private double lastPrice = 0; private Price priceObject = new Price(); private double price = 0; public void run() { price = priceObject.getNextPrice(lastPrice); System.out.println(); lastPrice = price; } }, delay, period); }


