GWT中的双括号有多大危害?

时间:2012-03-10 21:42:38

标签: java gwt syntax

我倾向于在GWT中使用(甚至过度使用)双括号对象初始化。对我而言,它看起来更具可读性和声明性。

new FastMap<Object>(){{
    put("Value", 12);
    put("Unit", "Kg");
}};

在此之前,我不知道这种语法不仅仅是实例化对象,还是创建AnonymousInnerClass for it。现在我担心GWT如何处理它们。

  1. 此语法如何影响执行的性能?
  2. 此语法如何影响编译大小?
  3. 还有其他坏事吗?
  4. 我的应用中有数以千计的此类初始化。

4 个答案:

答案 0 :(得分:5)

我的发现。测试code。我正在创建包含4个地图的单个列表,每个地图有21个项目我正在测量所有生成的JavaScript文件的大小。结果:

清空(只是空代码以确保呈现GWT支持代码):

  • PRETTY = 533 KB(546 602字节)
  • OBF = 212 KB(217 601字节)
  • new = 167
  • 的数量

代码没有双括号

  • PRETTY = 557 KB(570 682字节)
  • OBF = 222 KB(227 663字节)
  • new = 171
  • 的数量

相同的代码带有双括号

  • PRETTY = 567 KB(581 004字节)
  • OBF = 228 KB(234 089字节)
  • 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)

如果您只是定义这样的常量地图,那么使用GuavaImmutableMap可能会更好(包括速度和可读性):

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。)