當需要除錯無法修改原始碼的類別(如 Swing 元件、第三方庫)時,匿名內部類能實現「針對單一實例覆寫方法」,配合斷點精準定位問題,避免大面積打斷點干擾。
某 Swing 介面中有數十個 JButton,只有其中一個「莫名其妙」隱藏/顯示。若在 JButton.setVisible() 設斷點,所有按鈕操作都會中斷,極難隔離目標實例。
JButton suspiciousButton = new JButton("可疑按鈕") {
@Override
public void setVisible(boolean visible) {
// 1. 在此行設斷點
System.out.println("setVisible(" + visible + ") 呼叫堆疊:");
new Exception().printStackTrace(System.out); // 印出呼叫鏈
super.setVisible(visible);
}
};
panel.add(suspiciousButton);
只有 suspiciousButton 觸發斷點,其他按鈕完全不受影響。這就是「外科手術式除錯」。
OuterClass$1.class 等合成類別,僅影響該 new 表達式產生的物件。finalize() 追蹤 GC 行為(不建議常規使用)。| 場景 | 覆寫方法 | 目的 |
|---|---|---|
| 追蹤集合修改 | ArrayList.add/remove | 找出誰在非預期時間修改列表 |
| 監控資料庫連線洩漏 | Connection.close() | 記錄未歸還連線的分配堆疊 |
| 測試不可控依賴 | 第三方服務關鍵方法 | 注入 Mock 行為或記錄參數 |
| 事件處理補強 | addActionListener 內部 | 在無法修改原類別時添加日誌/統計 |
setVisible),此時仍需匿名類。IDE 斷點可設條件(如 visible == false),結合匿名類更精準:
JButton btn = new JButton("Test") {
@Override public void setVisible(boolean v) {
if (!v) { /* 只有隱藏時觸發 */ }
super.setVisible(v);
}
};
掌握此技巧,讓你在巨大代碼庫中像外科醫生一樣精準切除 Bug,而非像地毯式轟炸般盲目設斷點。