为什么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