簡體   English   中英

引用對象類型時使用final

[英]Use of final when referencing an Object type

private final  List<KeyListener> keyListeners= new CopyOnWriteArrayList<KeyListener>();

public void addKeyListener(KeyListener keyListener){
  keyListeners.add(keyListener);
}

在上面的代碼中,我將keyListeners聲明為final,並且它也是線程安全的。 我認為最終的意思是,構造之后,偵聽器的狀態無法更改。 但是我在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();
    }
}

Final關鍵字用於告訴該變量只能分配一次。 但是,即使它“更改”了對象屬性,也可以對其調用方法。

JLS

分配了最終變量后,它始終包含相同的值。 如果最終變量持有對對象的引用,則可以通過對該對象的操作來更改對象的狀態,但是該變量將始終引用同一對象。

僅僅因為最終引用了keyListeners的內部地址,而不是List本身。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM