引用Object类型时使用final

Inq*_*ive 0 java final

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()方法中没有做同样的事情吗?为什么编译器没有给我一个警告?我在这里错过了什么?

Eri*_*ric 5

添加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)