Java“双括号初始化”的效率?
Наэтотвопросестьответына 堆栈溢出нарусском:Чтотакое双括号инициализация? 在Java的“ 隐藏功能”中,最常见的答案是Double Brace Initialization,其语法非常诱人: Set<String> flavors = new HashSet<String>() {{ add("vanilla"); add("strawberry"); add("chocolate"); add("butter pecan"); }}; 此成语创建一个匿名内部类,其中仅包含一个实例初始化程序,该实例“可以使用包含范围中的任何方法”。 主要问题:这听起来像效率低下吗?它的使用是否应仅限于一次性初始化?(当然还有炫耀!) 第二个问题:新的HashSet必须是实例初始化程序中使用的“ this”……任何人都可以阐明该机制吗? 第三个问题:这个习惯用法是否太晦涩,无法在生产代码中使用? 摘要:非常非常好的答案,谢谢大家。在问题(3)上,人们认为语法应该明确(尽管我建议您偶尔发表评论,尤其是如果您的代码会传递给可能不熟悉它的开发人员时)。 关于问题(1),生成的代码应快速运行。多余的.class文件确实会导致jar文件混乱,并且会稍微减慢程序启动的速度(这要感谢@coobird进行测量)。@Thilo指出垃圾回收可能会受到影响,并且在某些情况下,额外加载的类的内存成本可能是一个因素。 问题(2)对我来说最有趣。如果我理解答案,那么DBI中发生的事情是匿名内部类扩展了new运算符正在构造的对象的类,因此具有引用此构造实例的“ this”值。井井有条。 总的来说,DBI令我感到好奇。Coobird和其他人指出,使用Arrays.asList,varargs方法,Google Collections和建议的Java 7 Collection文字可以实现相同的效果。较新的JVM语言(例如Scala,JRuby和Groovy)还为列表构建提供了简洁的符号,并且可以与Java很好地互操作。鉴于DBI会使类路径混乱,使类加载速度变慢,并使代码更加模糊,我可能会回避它。但是,我打算将这个介绍给一个刚刚获得SCJP并且喜欢Java语义的自然风趣的朋友!;-) 谢谢大家! 7/2017:Baeldung 对双括号初始化有很好的总结,并认为它是反模式。 12/2017:@Basil Bourque指出在新的Java 9中您可以说: Set<String> flavors = Set.of("vanilla", "strawberry", "chocolate", "butter pecan"); 那肯定是要走的路。如果您使用的是早期版本,请查看Google Collections的ImmutableSet。