首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 程式設計入門

Java 雙大括號初始化技巧:匿名內部類實現集合字面量語法糖

     編輯:Java 程式設計入門

痛點:Java 集合無字面量語法

Set<Character> letters = new HashSet<>();
letters.add('a');
letters.add('b');
// ... 繁瑣重複

雙大括號模式

Set<Character> letters = new HashSet<Character>() {{
    add('a'); add('b'); add('c'); add('d');
    add('e'); add('f'); add('g'); add('h');
    // ... 一次性填充
}};

原理拆解

  1. 外層 { }:定義一個 **匿名內部類**,繼承 HashSet。
  2. 內層 { }:**實例初始化塊**,在構造器執行前運行,此處 this 指向該匿名類實例,可直接調用 add()。

等價展開:

Set<Character> letters = new HashSet<Character>() {
    {
        add('a');
        add('b');
    }
};

優缺點權衡

優點缺點
代碼緊湊、聲明式風格產生**匿名類 Class 文件**(如 Main$1.class),增加元空間開銷
適用於測試、原型、小規模靜態數據持有外部類引用,可能阻礙 GC(若外部類大對象)
不支援鑽石操作符 <> 型推導(需顯式寫泛型)
序列化風險:匿名類隱含 serialVersionUID 不穩定

現代替代方案(Java 9+)

// List.of / Set.of / Map.of 不可變集合工廠
Set<Character> letters = Set.of('a','b','c','d','e','f','g','h');

// 可變集合
List<String> list = new ArrayList<>(List.of("a","b","c"));

**建議**:生產代碼優先用 List.of/Set.of 或 Stream 建構器;雙大括號僅限快速原型。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved