8

知道我们可以通过使用双括号初始化在 java 中初始化一个集合。并对此进行了一些搜索,发现由于其性能问题,不建议使用它。

private static final Set<String> VALID_CODES = new HashSet<String>() {{
    add("XZ13s");
    add("AB21/X");
    add("YYLEX");
    add("AR2D");
 }};

只是想知道,双括号初始化有什么积极的一面或优势吗?

4

2 回答 2

6

不建议使用它,因为它的性能问题。

我没有看到任何性能问题。每当您看到有人说我出于性能原因做了/没有做某事时,您应该期望看到详细的分析比较替代方案,解释一个如何满足特定要求的性能而另一个没有。如果您没有看到所有这些,您可能会认为作者只是在猜测。

编辑:虽然我承认每个类都需要少量时间来加载,但运行性能完全相同。我在这里演示了 https://stackoverflow.com/a/14627268/57695

如果您认为它更简单、更清晰,我会使用双括号表示法。

一个缺点是您正在更改集合的类型,这可能会混淆意想不到的功能。例如等于。

注意:正如 Lukas Eder 所指出的,如果在非静态上下文中执行此操作,请务必小心。匿名子类集合将隐式引用外部实例,如果它的寿命比集合长,这将是内存泄漏。 你有没有想过内存泄漏的可能性?

于 2013-01-31T13:16:53.710 回答
3

没有特别的性能问题(除了通过类加载器加载类的成本 - 可以忽略不计)

上面确实创建了一个匿名类,因此它包含this对周围实例的隐式引用。这可能会给序列化框架造成一些混乱。例如,你序列化你创建的匿名类,你突然发现你也在尝试序列化包含的实例。

我要强调的是,匿名类可以在不同的框架和语言中大量使用(Scala - 我在看着你)。我从来没有听说过有人建议 Scala 由于类加载而存在性能问题。初始启动可能会稍微慢一些,但请记住 JVM 启动、JIT 预热、任何网络访问等。

您可能会争辩说,由于类更多,您的应用程序占用空间更大。我怀疑(再次)影响可以忽略不计(除非你用匿名类构建整个应用程序!)

于 2013-01-31T13:19:14.237 回答