java - 引用对象类型时使用final

标签 java final

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/

相关文章:

java - 如何使用 viewPager 和 Fragments 传递多个数据

java - 在 Java 中对对象集合进行排序,其中实现类是最终的

java - 不可变类字段查询

java - 私有(private)静态方法中的最终字符串在调用时是否会实例化一个新对象?

java - 未调用静态 block

java - 在 Java 中创建常量对象

java - 如何使用数组在java中使用素数对数字进行编码?

java - 获取所有给定列表中出现的所有字符串

java - Java 中是否有等效的字段集(HTML)?

java - 提取计划作业的运行时间时出现问题