首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Android 監聽器提取最佳實踐:從匿名內部類到接口實現與工廠模式

     編輯:程式設計綜合問答

在 Android 開發中,將冗長的匿名內部類監聽器提取為獨立方法或接口實現,能顯著提升代碼可讀性與復用性。本文演示三種漸進式重構方案。

原始代碼:內聯匿名類

button.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
    @Override
    public boolean onPreferenceClick(Preference preference) {
        finish();
        return true;
    }
});

方案一:Activity 實現接口(最簡潔)

讓 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() 保持清爽,業務邏輯清晰可測。

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