我倾向于在GWT中使用(甚至过度使用)双括号对象初始化。对我而言,它看起来更具可读性和声明性。
new FastMap<Object>(){{
put("Value", 12);
put("Unit", "Kg");
}};
在此之前,我不知道这种语法不仅仅是实例化对象,还是创建AnonymousInnerClass for it。现在我担心GWT如何处理它们。
我的应用中有数以千计的此类初始化。
答案 0 :(得分:5)
我的发现。测试code。我正在创建包含4个地图的单个列表,每个地图有21个项目我正在测量所有生成的JavaScript文件的大小。结果:
清空(只是空代码以确保呈现GWT支持代码):
new
= 167 代码没有双括号:
new
= 171 相同的代码带有双括号:
new
= 177 我认为结果非常明显。
答案 1 :(得分:2)
这是标准的Java,与GWT无关。它在Efficiency of Java “Double Brace Initialization”?中全面处理。
我使用这种语法的最大问题是,它不提供FastMap
的实例,而是提供它的匿名子类。该对象不会将等于与以FastMap
的等效实例进行比较,并以传统方式设置数据。它也可能有其他不明显的问题,并且不那么容易调试。
线程here说明了这个
注意 - 双支撑初始化看起来很酷,但确实如此 比常规初始化要慢几个数量级 生成一个匿名类。
此外,生成的类被放入permgen空间,而不是 垃圾收集。默认情况下,permgen非常小 - 如果你 填写它,你的系统被冲洗了。
我在单元测试中一直使用它们,但从不在生产代码中使用它们。
答案 2 :(得分:1)
就可读性而言:我会将其更改为类似的内容,以便于阅读:
new FastMap<Object>()
{{
put("Value", 12);
put("Unit", "Kg");
}};
但是,您可能需要阅读this答案,以了解有关与效果相关的问题的更多信息。
答案 3 :(得分:1)
如果您只是定义这样的常量地图,那么使用Guava和ImmutableMap可能会更好(包括速度和可读性):
Map<Integer, Character> map = ImmutableMap.of(5, 'a', 1, 'b');
Map<Integer, String> largerMap = ImmutableMap.<Integer, String>builder()
.put(1, "a")
.put(2, "b");
.put(5, "wisconsin")
.build();
(他们来自谷歌,他们完全兼容GWT。)