每当有人使用双支撑初始化时,一只小猫就会被杀死。
除了语法相当不寻常而且不是真正的惯用语(当然味道有争议)之外,您在应用程序中不必要地创建了两个重要问题,我最近在这里更详细地讨论了这些问题。
你创造了太多的匿名课程
每次使用双括号初始化时,都会生成一个新类。 例如。 这个例子:
Map source = new HashMap(){{
put("firstName", "John");
put("lastName", "Smith");
put("organizations", new HashMap(){{
put("0", new HashMap(){{
put("id", "1234");
}});
put("abc", new HashMap(){{
put("id", "5678");
}});
}});
}};
...将产生这些类:
Test$1$1$1.class
Test$1$1$2.class
Test$1$1.class
Test$1.class
Test.class
这对你的类加载器来说是一个相当大的开销 - 什么都不是! 当然,如果你这样做一次,它将不需要太多的初始化时间。 但是,如果你在整个企业应用程序中执行此操作20'000次...所有堆内存只是为了一点“语法糖”?
你可能会造成内存泄漏!
如果您使用上面的代码并从方法返回该映射,那么该方法的调用者可能会毫无疑问地保留非常繁重的资源,而这些资源无法进行垃圾回收。 请考虑以下示例:
public class ReallyHeavyObject {
// Just to illustrate...
private int[] tonsOfValues;
private Resource[] tonsOfResources;
// This method almost does nothing
public Map quickHarmlessMethod() {
Map source = new HashMap(){{
put("firstName", "John");
put("lastName", "Smith");
put("organizations", new HashMap(){{
put("0", new HashMap(){{
put("id", "1234");
}});
put("abc", new HashMap(){{
put("id", "5678");
}});
}});
}};
return source;
}
}
返回的Map现在将包含对封闭实例ReallyHeavyObject的引用。您可能不希望冒这样的风险:
图片来自[http://blog.jooq.org/2014/12/08/dont-be-clever-the-double-curly-braces-anti-pattern/]
你可以假装Java有地图文字
为了回答你的实际问题,人们一直在使用这种语法假装Java有类似于现有数组文字的地图文字:
String[] array = { "John", "Doe" };
Map map = new HashMap() {{ put("John", "Doe"); }};
有些人可能会发现这种语法刺激。