Java 中的双重花括号初始化

2025 年 4 月 21 日 | 阅读 4 分钟

双花括号初始化是 Java 中一种用于简洁方便地初始化类实例并为其字段提供初始值的方法。它涉及在实例化代码块中使用嵌套的花括号。尽管该方法在某些场景下可能有用,但了解其影响和局限性也很重要。

双花括号初始化语法涉及创建一个匿名内部类,并在其中使用实例初始化器块。

语法

外部的 new ClassName() 会创建一个基于 ClassName 的匿名内部类。双花括号 {{ ... }} 定义了实例初始化器块。该块在匿名内部类创建期间执行。在实例初始化器块中,您可以编写初始化代码,例如设置默认值或调用方法。双花括号初始化可用于任何类,包括内置类、用户定义的类,甚至匿名类。

方法 1:标准方法

我们都知道标准方法,即不使用双花括号的方法,我们在其中使用单花括号来编写函数和语句。

它表示为 {….}.

算法

步骤 1:在 main 方法中开始程序执行。

步骤 2:创建一个名为 stringSet 的空字符串 HashSet。

步骤 3:使用 add 方法向 stringSet 添加三个元素(“cat”、“dog”和“lion”)。

步骤 4:调用 useMethodIn 辅助方法,并将 stringSet 作为参数传递。

步骤 5:在 useMethodIn 方法内部

步骤 5.1:接收 stringSet 参数。

步骤 5.2:使用 System.out.println 方法打印作为参数传递的集合的所有元素。

步骤 6:程序执行结束。

实施

上述步骤的实现如下

文件名: SomeClass.java

输出

[cat, dog, lion]

方法 2:双花括号初始化

双花括号初始化技术提供了一种紧凑且内联的方式,可以直接在实例化代码块中初始化字段。它涉及使用嵌套的花括号来定义字段值。

算法

步骤 1:在 main 方法中开始程序执行。

步骤 2:使用双花括号初始化创建一个名为 st 的空 HashSet。

步骤 2.1:在双花括号内,使用 add 方法向 HashSet 添加三个元素(“cat”、“dog”和“lion”)。

步骤 3:调用 useMethodIn 辅助方法,并将 st HashSet 作为参数传递。

步骤 4:在 useMethodIn 方法内部

步骤 4.1:接收 Set<String> 类型的 st 参数。

步骤 4.2:使用 System.out.println 方法打印作为参数传递的 Set 的所有元素。

步骤 5:程序执行结束。

实施

上述步骤的实现如下

文件名: SomeClass.java

输出

[cat, dog, lion]

优点

  • 双花括号初始化允许在单个表达式中创建和初始化对象,从而减少了实现相同结果所需的代码行数。
  • 该语法可以使代码更具可读性,尤其适用于简单的数据结构或集合。
  • 通过将初始化逻辑封装在花括号内,您可以轻松定义和初始化数据成员或集合,而无需单独的方法。

缺点

  • 双花括号初始化不是一种广为人知或常用的方法,这使得代码的可维护性降低,并且可能让其他开发人员感到困惑。
  • 每次使用双花括号初始化都会创建一个匿名内部类,这可能导致内存使用量增加和性能开销。
  • 该技术不支持 Java 7 中引入的“菱形运算符”等高级语言功能,后者可以简化泛型类型声明。
  • 如果被扩展的类被标记为 final,则不能使用双花括号初始化,这限制了其适用性。
  • 双花括号初始化会持有对封闭实例的隐藏引用,如果管理不当,可能会导致意外的内存泄漏。在 long-lived 对象中使用此技术时,务必谨慎。