Java如何简化涉及布尔比较的形状标志重复冗余代码
解决方案
核心优化思路
- 移除冗余状态:你当前的场景本质是单选互斥状态,最多只有一个形状被选中,完全可以用单个变量存储当前选中的形状,直接省去三个独立flag的重复赋值逻辑
- 消除重复分支:用策略模式+Map存储不同形状的自定义处理逻辑,避免多段重复的
pressed方法和if-else分支
极简实现(不同形状处理逻辑无差异时)
如果所有形状的选中、取消逻辑没有个性化差异,几行代码就可以完成功能:
// 替换原来三个flag的变量,null表示无选中状态 private String currentSelectedShape = null; public void shapeButtonPressed(String shapeType) { if (!shapeType.equals(currentSelectedShape)) { // 选中目标形状 currentSelectedShape = shapeType; // 原来各个pressed方法if块的公共代码 } else { // 取消选中 currentSelectedShape = null; // 原来各个pressed方法else块的公共代码 } }
支持个性化逻辑的实现(不同形状处理逻辑不同时)
如果不同形状的选中、取消逻辑有差异,用枚举+Map存储处理逻辑,可维护性更高:
// 定义形状枚举,比字符串校验更安全 enum Shape { CIRCLE, SQUARE, DIAMOND } // 选中状态存储 private Shape currentSelectedShape = null; // 存储各形状选中、取消的个性化处理逻辑 private final Map<Shape, Runnable> selectHandlers = new HashMap<>(); private final Map<Shape, Runnable> deselectHandlers = new HashMap<>(); // 初始化时注册所有处理逻辑 public void initShapeHandlers() { // 圆形选中/取消逻辑 selectHandlers.put(Shape.CIRCLE, () -> { // 原circlePressed方法if块的个性化代码 }); deselectHandlers.put(Shape.CIRCLE, () -> { // 原circlePressed方法else块的个性化代码 }); // 正方形选中/取消逻辑 selectHandlers.put(Shape.SQUARE, () -> { // 原squarePressed方法if块的个性化代码 }); deselectHandlers.put(Shape.SQUARE, () -> { // 原squarePressed方法else块的个性化代码 }); // 菱形选中/取消逻辑 selectHandlers.put(Shape.DIAMOND, () -> { // 原diamondPressed方法if块的个性化代码 }); deselectHandlers.put(Shape.DIAMOND, () -> { // 原diamondPressed方法else块的个性化代码 }); } public void shapeButtonPressed(String shapeType) { Shape targetShape = Shape.valueOf(shapeType.toUpperCase()); if (currentSelectedShape != targetShape) { currentSelectedShape = targetShape; selectHandlers.get(targetShape).run(); } else { currentSelectedShape = null; deselectHandlers.get(targetShape).run(); } }
原尝试方案失效原因说明
Java中Boolean是不可变类,你存入List/Map的只是Boolean值的拷贝,遍历赋值时只会修改临时变量的引用,不会修改原来的flag变量,因此无法实现状态更新。
内容的提问来源于stack exchange,提问作者hexaquark
相关产品推荐
相关产品推荐

