要知道我们可以通过使用双括号初始化来初始化java中的集合。并对此进行了一些搜索,发现由于其性能问题,不建议使用它。
private static final Set<String> VALID_CODES = new HashSet<String>() {{
add("XZ13s");
add("AB21/X");
add("YYLEX");
add("AR2D");
}};
只是想知道,双重初始化有任何积极的一面或优势吗?
答案 0 :(得分:6)
由于其性能问题,不建议使用它。
我没有看到任何性能问题。每当你看到有人说我出于性能原因而做了/没有做某事时,你应该期待看到详细的分析比较解释如何满足特定要求的性能而另一个没有满足的替代方案。如果你没有看到这一切,你可能会认为作者只是猜测。
编辑:虽然我承认每个课程需要花费很少的时间来加载,但是运行性能完全相同。我在这里演示了https://stackoverflow.com/a/14627268/57695
如果您认为它更简单,更清晰,我会使用双括号表示法。
缺点是你正在改变集合的类型,这可能会混淆不期望的函数。例如等于
注意:正如Lukas Eder所指出的那样,如果你在非静态环境中这样做,你会要小心。匿名子类集合将隐式地具有对外部实例的引用,并且如果它比集合长,则这将是内存泄漏。 Have you ever thought of the possibility of a memory leak?
答案 1 :(得分:3)
没有特别的性能问题(超出通过类加载器加载类的成本 - 可以忽略不计)
上面的 创建了一个匿名类,因此它包含对周围实例的隐式this
引用。这可能会导致序列化框架的一些混乱。例如你序列化你创建的匿名类,然后你突然发现你也在尝试序列化包含的实例。
我要强调的是,匿名类可以在不同的框架和语言中使用很多(Scala - 我在看着你)。我从来没有听到有人建议Scala因为类加载而存在性能问题。初始启动可能分数较慢,但要记住JVM启动,JIT热备,任何网络访问等。
您可能会争辩说,由于课程更多,您的应用程序占用空间更大。我怀疑(再次)效果可以忽略不计(除非你用匿名类构建一个完整的应用程序!)