在 Android 開發中,將冗長的匿名內部類監聽器提取為獨立方法或接口實現,能顯著提升代碼可讀性與復用性。本文演示三種漸進式重構方案。
button.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
finish();
return true;
}
});
讓 Activity 直接實現 Preference.OnPreferenceClickListener:
public class MainActivity extends Activity implements Preference.OnPreferenceClickListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Preference button = findPreference("exitlink");
if (button != null) {
button.setOnPreferenceClickListener(this); // 關鍵:傳 this
}
}
@Override
public boolean onPreferenceClick(Preference preference) {
finish();
return true;
}
}
優點:代碼極簡;缺點:Activity 單一職責原則稍弱,多監聽器時會膨脹。
封裝工廠方法,支持參數化定制:
private Preference.OnPreferenceClickListener createExitListener() {
return new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
Log.d("TAG", "Exit clicked");
finish();
return true;
}
};
}
// 調用
button.setOnPreferenceClickListener(createExitListener());
進階版:帶參數工廠,適用於列表項、動態生成場景:
private Preference.OnPreferenceClickListener createListener(final int id) {
return preference -> {
Log.d("TAG", "Listener " + id + " invoked");
finish();
return true;
};
}
創建 ExitClickListener implements Preference.OnPreferenceClickListener,構造函數注入依賴(Context、Repository 等),實現完全解耦,利於單元測試。
| 場景 | 推薦方案 |
|---|---|
| 簡單頁面、單一監聽器 | 方案一(Activity 實現接口) |
| 需參數化、邏輯復用 | 方案二(工廠方法) |
| 複雜業務、需測試、多處復用 | 方案三(獨立類) |
合理提取監聽器,讓 onCreate() 保持清爽,業務邏輯清晰可測。