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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 19:57:03