2 回答

TA貢獻(xiàn)1805條經(jīng)驗(yàn) 獲得超9個(gè)贊
第二個(gè)不能序列化(拋出 NotSerializableException)。
這將是因?yàn)槟诜强尚蛄谢愔械姆庆o態(tài)方法中初始化地圖。
雙括號(hào)初始化實(shí)際上只是用實(shí)例初始化器定義一個(gè)匿名類。非靜態(tài)上下文中的匿名類捕獲對(duì)封閉實(shí)例的引用。
如果該類不可序列化,則無法序列化匿名類實(shí)例??雌饋磉@段代碼在單元測(cè)試類中;這樣的類可序列化是非常不尋常的。
老實(shí)說,最簡(jiǎn)單的解決方案就是避免雙括號(hào)初始化。它是一種過于聰明的句法軟糖。
但是,如果您真的堅(jiān)持使用它,您可以簡(jiǎn)單地在靜態(tài)方法中進(jìn)行初始化。
static Map<String, Object> doubleBrace() {
return new HashMap<String, Object>(){
private static final long serialVersionUID = 1L;
{
put("test", "String");
}};
}
但這在某種程度上破壞了首先使用雙括號(hào)初始化的簡(jiǎn)潔性。

TA貢獻(xiàn)1810條經(jīng)驗(yàn) 獲得超4個(gè)贊
在這個(gè)演示中,Map<String, Object> m = new HashMap<String, Object>(){是一個(gè)匿名的內(nèi)部類,你可以System.out.println(m.getClass())用來檢查m的類。
public class Utilt implements Serializable {
private static final long serialVersionUID = -7271914225876022793L;
@Test
public void UtilTest() throws IOException, ClassNotFoundException {
Map<String, Object> m = new HashMap<String, Object>(){
private static final long serialVersionUID = 1L;
{
put("test", "String");
}};
Map<String, Object> m2 = new HashMap<String, Object>();
m2.put("test", "String");
Assert.assertEquals(m, m2); // true
Assert.assertTrue(m.equals(m2)); // true
Assert.assertEquals(Utils.deserialize(Utils.serialize(m2)), m2); // ok
Assert.assertEquals(Utils.deserialize(Utils.serialize(m)), m);
}
}
添加回答
舉報(bào)