[英]When should or shouldn't I use a more general variable type for referencing my object?
[英]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.