private final List<KeyListener> keyListeners= new CopyOnWriteArrayList<KeyListener>();
public void addKeyListener(KeyListener keyListener){
keyListeners.add(keyListener);
}
在上面的代码中,我声明 keyListeners 是最终的,并且它是线程安全的。我认为最终的意思是监听器的状态在构造后不能改变。但我不是在 addKeyListener() 方法中做同样的事情吗?为什么编译器不给我警告?我在这里缺少什么?
最佳答案
添加final
关键字意味着keyListeners
将在整个程序中指向相同的CopyOnWriteArrayList
。这样做是非法的:
keyListeners = null
但是,keyListeners
的方法仍然可以自由调用。它们是否影响底层数据结构不是编译器关心的事情。
class Foo {
public int bar = 1;
public static void test() {
final Foo x = new Foo();
//This is perfectly legal:
x.bar = 2;
//This is not:
x = new Foo();
}
}
关于java - 引用对象类型时使用final,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11360025/