本文正在参加「Java主题月 – Java Debug笔记活动」,详情查看<活动链接>
提问:什么是Java的双括号初始化?
如题,双括号初始化有什么坏处
回答1:
双括号初始化将创建一个从指定类(外部括号)派生的匿名类,并在该类(内部括号)内提供一个初始化程序块。举个例子
new ArrayList<Integer>() {{
add(1);
add(2);
}};
复制代码
请注意,使用双括号初始化的作用是创建匿名内部类。值得一提的是,创建的类具有隐式的this指针只想周围其他外部类。虽然通常情况下这不会出现问题,但在某些情况下(例如序列化或垃圾收集时)可能会引起程序运行的麻烦。
回答2:
除了语法非常不寻常且不是我们真正惯用的(当然,有的时候确实真香)之外,您还在应用程序中不必要地创建了两个重要问题
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.class
Test$1$1$2.class
Test$1$1.class
Test$1.class
Test.class
复制代码
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。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END