Java GWT中的双支架有多大危害?
我倾向于在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如何处理它们 此语法如何影响执行的性能 此语法如何影响
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();