2 回答

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

TA貢獻1810條經驗 獲得超4個贊
在這個演示中,Map<String, Object> m = new HashMap<String, Object>(){是一個匿名的內部類,你可以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);
}
}
添加回答
舉報