You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java如何简化重复if/else与点击监听代码 避免冗余缩小函数体积

优化实现方案

完全可以实现if/else逻辑、点击监听逻辑仅编写一次,核心思路是把三处逻辑里的可变参数提取为方法入参,重复逻辑封装为通用函数。


步骤1:抽取完全重复的底部导航监听逻辑

三处点击事件里的底部导航选择逻辑完全一致,先单独封装为方法:

private BottomNavigationView.OnNavigationItemSelectedListener getNavigationListener() {
    return item -> {
        switch (item.getItemId()) {
            case R.id.accueil:
                return true;
            case R.id.commerce:
                startActivity(new Intent(getApplicationContext(), PageCommercial.class));
                overridePendingTransition(0, 0);
                return true;
            case R.id.services:
                startActivity(new Intent(getApplicationContext(), Support.class));
                overridePendingTransition(0, 0);
                return true;
            case R.id.info:
                startActivity(new Intent(getApplicationContext(), Info.class));
                overridePendingTransition(0, 0);
                return true;
        }
        return false;
    };
}

步骤2:封装控件状态设置+点击监听的通用方法

把三处逻辑的可变点(子串截取范围、目标控件、点击后设置的背景资源)作为入参,整合所有重复逻辑:

/**
 * 通用初始化控件方法
 * @param text 原始截取文本
 * @param subStart 子串截取起始索引
 * @param subEnd 子串截取结束索引
 * @param targetView 要设置状态、绑定点击事件的目标控件
 * @param repartiteurBgRes 点击后要设置的Repartiteur背景资源
 */
private void initControl(String text, int subStart, int subEnd, View targetView, int repartiteurBgRes) {
    // if/else逻辑仅编写一次
    if (text.substring(subStart, subEnd).contains("A")) {
        targetView.setBackgroundResource(R.drawable.picto_rouge);
    } else {
        targetView.setBackgroundResource(R.drawable.picto_vert);
    }

    // 点击监听逻辑仅编写一次
    targetView.setOnClickListener(a -> {
        setContentView(R.layout.activity_autodiagnostic_repartiteur);
        View repartiteur = findViewById(R.id.Repartiteur);
        repartiteur.setBackgroundResource(repartiteurBgRes);
        BottomNavigationView bandeauNavigationView = findViewById(R.id.bandeau_navigation);
        bandeauNavigationView.setSelectedItemId(R.id.accueil);
        bandeauNavigationView.setOnNavigationItemSelectedListener(getNavigationListener());
    });
}

步骤3:替换原有重复代码

原来的上百行重复逻辑直接替换为3行调用即可:

initControl(text, 15, 18, R2, R.drawable.repartiteur2);
initControl(text, 19, 22, R3, R.drawable.repartiteur3);
initControl(text, 23, 26, R4, R.drawable.repartiteur4);

额外优化建议

  • 遵循Java命名规范:变量首字母小写,比如Repartiteur建议改为repartiteur,控件变量R2/R3/R4也建议改为小写开头的驼峰格式
  • 消除魔法数值:把子串截取的索引、固定的背景资源定义为常量,比如private static final int SUB_START_R2 = 15,后续修改参数时直接改常量即可,不需要调整业务逻辑
  • 后续如果新增同类控件,只需要加一行initControl调用即可,不需要再复制重复代码

内容的提问来源于stack exchange,提问作者Antoine

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 15:45:05