Java GWT中的双支架有多大危害?

Java GWT中的双支架有多大危害?,java,gwt,syntax,Java,Gwt,Syntax,我倾向于在GWT中使用(甚至过度使用)双大括号对象初始化。对我来说,它看起来更具可读性和声明性 new FastMap<Object>(){{ put("Value", 12); put("Unit", "Kg"); }}; newfastmap(){{ put(“Value”,12); put(“单位”、“千克”); }}; 在今天之前,我不知道这种语法不仅仅是实例化对象,而且是创建对象。现在我关心的是GWT如何处理它们 此语法如何影响执行的性能 此语法如何影响

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

new FastMap<Object>(){{
    put("Value", 12);
    put("Unit", "Kg");
}};
newfastmap(){{
put(“Value”,12);
put(“单位”、“千克”);
}};
在今天之前,我不知道这种语法不仅仅是实例化对象,而且是创建对象。现在我关心的是GWT如何处理它们

  • 此语法如何影响执行的性能
  • 此语法如何影响编译大小
  • 还有什么坏事吗

  • 我的应用程序中有数千个这样的初始化。

    就可读性而言:我会将其更改为类似以下内容,以便于阅读:

    new FastMap<Object>()
    {{
        put("Value", 12);
        put("Unit", "Kg");
    }};
    
    newfastmap()
    {{
    put(“Value”,12);
    put(“单位”、“千克”);
    }};
    

    不过,您可能希望阅读答案,以了解有关性能相关问题的更多信息。

    如果您只是这样定义常量映射,则最好使用和(速度和可读性):

    Map Map=ImmutableMap.of(5'a',1'b');
    Map largerMap=ImmutableMap.builder()
    .put(1,“a”)
    。付诸表决(2,“b”);
    .put(5,“威斯康星州”)
    .build();
    

    (它们来自谷歌,完全兼容GWT。)

    这是标准Java,独立于GWT。这一问题在本章中作了全面论述

    这种语法的最大问题是,它没有提供
    FastMap
    的实例,而是该类的匿名子类。该对象与以传统方式设置的数据相比,不等于
    FastMap
    的等效实例。它还可能有其他不明显的问题,并且调试起来不那么简单


    这条线是这样写的

    注意-双大括号初始化看起来很酷,但它很简单 比常规初始化慢几个数量级,因为它必须 生成一个匿名类

    此外,生成的类被放入permgen空间,而permgen空间不是 垃圾收集。默认情况下,永久发电机相当小——如果 加满水,你的系统就被水淹没了

    我一直在单元测试中使用它们,但从未在生产代码中使用过

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

    空(只需空代码以确保GWT支持呈现的代码):

    • PRETTY=533KB(546602字节)
    • OBF=212 KB(217 601字节)
    • 新的数量=167
    不带双大括号的代码

    • PRETTY=557KB(570682字节)
    • OBF=222KB(227663字节)
    • 新的<代码>数量<代码>=171
    和带有双大括号的相同代码

    • PRETTY=567KB(581004字节)
    • OBF=228KB(234089字节)
    • 新的数量=177

    我认为结果是不言自明的。

    这是无法编译的。您忘记了第二组大括号。您提供的链接是关于java的,而不是关于GWT的。在GWT中,它编译为javascript而不使用任何对象。在GWT中,它可能不会有任何明显的有害影响。我认为这样把大括号放在一起会隐藏语法。外部大括号对是匿名子类的分隔符,而内部大括号对是初始化代码块的开始和结束。实际上,在大多数情况下,这是我的内部DSL。感谢您提供有关番石榴和ImmutableMap的链接。看起来很有希望,问得好。尝试使用-style=PRETTY进行编译,这可能会有所帮助。但GWT不仅仅是另一个Java API,而是一个“DSL”(实际上不是t,但很幽默),它看起来像Java并编译成客户端Javascript。这个过程可能处理的DBI不同于Java编译器,而运行时JVM处理它。@Kevin:刚刚弄明白除了数据库接口之外DBI意味着什么!是的,我也同意你的看法。“对某些人来说,检查几行这样的Java编译成什么是很简单的。”Borodin用一些测试restuls添加了答案。
    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();