在需要臨時實現接口(如 Comparator)時,Java 提供兩種語法選擇:
Collections.sort(list, new Comparator() {
public int compare(Object o1, Object o2) {
int cc = ((Integer)o1).compareTo(o2);
return (cc < 0 ? 1 : cc > 0 ? -1 : 0);
}
});
class MyComparator implements Comparator {
public int compare(Object o1, Object o2) {
int cc = ((Integer)o1).compareTo(o2);
return (cc < 0 ? 1 : cc > 0 ? -1 : 0);
}
}
Collections.sort(list, new MyComparator());
| 維度 | 匿名類 | 局部類 |
|---|---|---|
| 語法形式 | 表達式一部分,內聯定義 | 獨立類聲明,類似普通類 |
| 可讀性 | 簡潔但嵌套深時難讀 | 結構清晰,易於維護 |
| 複用性 | 無法複用,每次創建新類 | 可多次實例化,邏輯復用 |
| 訪問外部變量 | 僅能訪問 final/實際最終變量 | 相同限制 |
| 構造函數 | 無法顯式定義 | 可定義構造函數,支持參數化 |
| 實現多接口 | 不可 | 可實現多個接口 |
// 匿名類:每次調用都重新定義類,產生多個 Class 文件
void sort1(List list1, List list2) {
Collections.sort(list1, new Comparator() { ... });
Collections.sort(list2, new Comparator() { ... }); // 重複代碼
}
// 局部類:定義一次,多次實例化
void sort2(List list1, List list2) {
class MyComparator implements Comparator { ... }
Collections.sort(list1, new MyComparator());
Collections.sort(list2, new MyComparator()); // 復用邏輯
}
// 匿名類也可通過變量復用(但語義較怪異)
void sort3(List list1, List list2) {
Comparator cmp = new Comparator() { ... };
Collections.sort(list1, cmp);
Collections.sort(list2, cmp);
}
OuterClass$1.class、OuterClass$2.class...OuterClass$1MyComparator.class(名稱可讀)簡單一次性邏輯 → 匿名類
需復用、參數化、複雜邏輯 → 局部類
長期使用、跨方法共享 → 獨立頂級類或靜態內部類
理解兩者差異,能讓代碼既簡潔又靈活,避免過度設計或重複造輪子。