在 Java 開發中,當需要實作介面或繼承類別並即時建立物件時,常會用到匿名類別與局部類別。兩者雖然都能達到類似目的,但在語法結構、可讀性、重用性以及建構子支援上存在關鍵差異。本文透過具體程式碼範例,深入剖析兩者的異同,幫助開發者做出更合適的選擇。
假設我們有一個 Integer 清單,想依降序排序。以下展示兩種寫法:
import java.util.*;
public class LocalDemo1 {
// 使用實作 Comparator 的匿名類別排序
static void sortanon(List list) {
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);
}
});
}
// ... main 方法測試 ...
}
// 使用實作 Comparator 的局部類別排序
static void sortlocal(List list) {
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());
}
兩者輸出皆為 [3, 2, 1],功能相同,但結構不同。
new Comparator() {...}),程式碼緊湊,但較難閱讀,尤其當邏輯複雜時。implements、extends),較冗長但結構清晰,易於理解與維護。當需要對多個清單套用相同比較邏輯時:
匿名類別無法定義建構子(因無名稱),只能透過實例初始化區塊 {...} 做簡單初始化。局部類別則可擁有完整建構子,支援參數傳遞,彈性更高。
// 匿名類別初始化區塊
Comparator cmp1 = new Comparator() {
{ System.out.println("object initialization"); }
public int compare(Object o1, Object o2) { ... }
};
// 局部類別可帶建構子參數
class MyComparator implements Comparator {
public MyComparator(int x) { System.out.println("constructor called with value " + x); }
public int compare(Object o1, Object o2) { ... }
}
Comparator cmp2 = new MyComparator(100);
理解匿名類別與局部類別的特性,能讓你在實作介面、回呼、事件處理等場合做出更優雅的設計選擇。善用兩者優勢,寫出更清晰、可維護的 Java 程式碼。