2012-07-06 17 views
0
private final List<KeyListener> keyListeners= new CopyOnWriteArrayList<KeyListener>(); 

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

在上面的代碼中,我聲明keyListeners是final,也是線程安全的。我最後假定我的意思是聽者的狀態在施工後不能改變。但是,我不在addKeyListener()方法中做同樣的事情嗎?爲什麼編譯器不給我一個警告?我在這裏錯過了什麼?引用對象類型時最終的使用

+0

更多關於決賽:[Java的做法 - 使用最終寬鬆(http://www.javapractices.com/topic/TopicAction.do?Id=23的 「Java規範 - 使用最終慷慨」) – 2012-07-06 11:31:30

回答

3

最終關鍵字是用來告訴該變量可以僅一次分配給。但即使「更改」對象屬性,也可以調用它。

JLS

一旦最終的變數已被分配,它總是包含相同的值。如果一個最終變量持有一個對象的引用,那麼該對象的狀態可以通過對該對象的操作來改變,但該變量將始終引用相同的對象。

+0

+1用於鏈接到JLS。這正是我想要學習的內容。 – Inquisitive 2012-07-06 10:13:34

+0

@Subhra不用客氣,JLS經常提供您需要了解的關於Java的所有信息! – 2012-07-06 10:16:11

0

只是因爲最終引用keyListeners的內部地址而不是列表本身。

5

添加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(); 
    } 
} 
+0

+1,另外Collections'unmodifiableSet值得一提 – 2012-07-06 10:05:08

+0

@eric當添加到像int這樣的基本類型時,'final'的用法如何,以及在添加到像這種情況下的引用類型時如何使用?我認爲'最後'的領域是不變的,因爲他們永遠不能改變他們的狀態。 – Inquisitive 2012-07-06 10:06:06

+0

@BenjaminGruenbaum:從這個問題看來,OP似乎不想要不變性,但只是想知道爲什麼上面的代碼工作 – Eric 2012-07-06 10:06:09

相關問題