不负相思意
每当有人使用双支撑初始化时,小猫就会被杀死。除了语法非常不寻常而且不太地道(当然,品味是有争议的)之外,您还不必要地在应用程序中创建了两个重要的问题,我最近在博客上更详细地描述了.1.你创建的匿名类太多了每次使用双大括号初始化时,都会生成一个新类。例如:这个例子: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.classTest$1$1$2.classTest$1$1.classTest$1.classTest.class对于您的类加载程序来说,这是相当大的开销-没有!当然,如果你只做一次的话,初始化时间不会很长。但是如果你在整个企业应用程序中这样做了20,000次.所有的堆内存只是为了一点“语法糖”?2.你可能会造成内存泄漏!如果您获取上述代码并从方法中返回该映射,则该方法的调用方可能会对无法被垃圾收集的非常庞大的资源进行管理。考虑以下示例: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/不聪明-双花括号-反模式/3.你可以假装Java有地图文字为了回答您的实际问题,人们一直在使用这种语法来假装Java有类似于映射文本的东西,类似于现有的数组文本:String[] array = { "John", "Doe" };Map map = new HashMap() {{ put("John", "Doe"); }};有些人可能会觉得这在句法上很刺激。