2013-10-12 38 views
0

我有size作爲參數的構造函數。 Eclipse迫使我宣佈Integer size爲最終。爲什麼?爲什麼日食迫使我使用最後的?

public LRUCache(final Integer size) { 
     lhm = Collections.synchronizedMap(new LinkedHashMap<String, Integer>() { 
      @Override 
      public boolean removeEldestEntry(Map.Entry eldest) { 
       return size() > size; 
      } 
     }); 
    } 

回答

1

size是一個Integer對象的引用。當你做

size() > size 

你提領size獲取其int價值。由於removeEldestEntry發生在不同的上下文中,在不同的時間,需要保證您使用的引用與您聲明的引用相同。因此你需要final,即。所以參考不能改變。

the Java Language Specification

任何局部變量,形式參數,或使用了何種異常參數,但在 一個內部類沒有聲明必須聲明爲final。

and

每一個局部變量(§14.4)和每一個空白的最後一個字段(§4.12.4, §8.3.1.2)必須有一個明確指定值時,其 價值的任何訪問發生。

and

V時匿名類聲明之前是明確賦值 (§15.9.5),其爲V當且僅當V的範圍內聲明絕對是 類實例創建表達式之後分配該聲明 匿名類。

+0

對不起,雖然你的引用是正確的,但你的解釋是關閉的。你沒有提到匿名類必須複製局部變量,這是問題的全部關鍵。我不確定爲什麼這個答案被接受。 –

+0

@HovercraftFullOfEels我相信這就是我的意思與_there需要有一些保證您所使用的基準是你declaring_相同 –

3

Eclipse並沒有強制任何東西。 的Java需要局部變量聲明最後如果他們在匿名內部類中使用。這些類使用任何使用的局部變量的副本,如果變量不是最終的,則原始和副本可能指的是不同的值。

+0

尼特:它不是每本身(WRT該「可以指的是不同的值」),該發生的一般規定;它是Java規範如何定義它的。許多閉包語言允許修改綁定綁定 - 匿名內部類只是一個「窮人的替代品」,這是其中一個限制。 – user2864740

+0

@ user2864740:它目前是* Java Requirement *,並且你是對的,這就是Java的定義。這可能會隨Java 8發生變化。 –

+0

我不是故意暗示它不是Java要求。我在我最初的評論中重寫了語言。 – user2864740

相關問題