private final List<KeyListener> keyListeners= new CopyOnWriteArrayList<KeyListener>();
public void addKeyListener(KeyListener keyListener){
keyListeners.add(keyListener);
}
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,我将keyListeners声明为final,也是线程安全的.我假设最终我的意思是听众的状态在施工后无法改变.但是我在addKeyListener()方法中没有做同样的事情吗?为什么编译器没有给我一个警告?我在这里错过了什么?
添加final关键字意味着在整个程序中keyListeners指向相同的关键字CopyOnWriteArrayList.这样做是违法的:
keyListeners = null
Run Code Online (Sandbox Code Playgroud)
但是,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();
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
45 次 |
| 最近记录: |