爲什麼Elvis elvis的定義必須是在Thread run()方法內部使用的最終定義?Thread的run()方法中的最終枚舉
Elvis elvis = Elvis.INSTANCE; // ----> should be final Elvis elvis = Elvis.INSTANCE
elvis.sing(4);
Thread t1 = new Thread(
new Runnable() {
@Override
public void run() {
elvis.sing(6); // --------> elvis has to be final to compile
}
}
);
public enum Elvis {
INSTANCE(2);
Elvis() {
this.x = new AtomicInteger(0);
}
Elvis(int x){
this.x = new AtomicInteger(x);
}
private AtomicInteger x = new AtomicInteger(0);
public int getX() { return x.get(); }
public void setX(int x) {this.x = new AtomicInteger(x);}
public void sing(int x) {
this.x = new AtomicInteger(x);
System.out.println("Elvis singing.." + x);
}
}
捕獲變量需要變量實際存儲在可捕獲的表單中。可以肯定的是,但要求首先使用一種完全不同的方式來編譯變量,所以我可以看到不願誤入歧途。 – 2010-03-28 12:17:25
@ Jon,@ Donal變量elvis本身就是枚舉,它本來就是一個枚舉單身。我會想象它只能初始化一次,並且實際上是最終的? – portoalet 2010-03-28 12:26:56
@portoalet:否。*變量*不是枚舉或單例。 *變量*只是一個正常的變量。枚舉類型本身可能只能初始化一次,但這與該枚舉類型的*變量*在其生命週期中是否可以分配不同的值非常不同。 – 2010-03-28 12:39:47