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
相关产品推荐
相关产品推荐

