2012-02-19 48 views
3

我已經重構了以下對象初始化:Java的雙支柱初始化

Req r = new Req(); 
r.set_f1("A"); 
r.set_f2(123); 
r.set_f3(123.456); 

分爲:

Req r = new Req() {{ 
    set_f1("A"); 
    set_f2(123); 
    set_f3(123.456) 
}}; 

第二個示例引發以下的Eclipse警告:

的序列化類呢未聲明類型爲long的靜態最終serialVersionUID字段

我認爲這些代碼示例應該是等效的 - 有什麼區別?

+4

這兩個絕對不是等價的,它們是非常不同的。所有關於雙括號初始化的問題都充滿了。 – skaffman 2012-02-19 14:16:28

+0

@duffymo你對此絕對錯誤。 – Irfy 2012-02-19 14:17:31

+1

爲什麼你會決定以這種方式「重構」你原來的例子?! Double brace init並不是一個廣泛使用的練習!如何使Req的構造函數接受該數據: Req req = new Req(x,y,z); – 2012-02-19 14:20:39

回答

2

如果基類實現java.io.Serializable那麼子類將會有一個serialVersionUID。內部類不應該是可串行化的。

如果您計劃通過此代碼創建的對象暴露給可能想要序列化數據的其他代碼,請不要使用雙括號成語(我想你可以使用它與writeReplace,但得到有點醜陋)。如果您確定您的代碼不會與serilisation接觸,請儘可能廣泛地使用@SuppressWarnings("serial")

6

第二個創建一個匿名子類並使用一個未命名的初始化程序初始化它。如果Req是可序列化的,則它的任何子類都是,因此應該定義一個serialVersionUID