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

switch语句冗余问题咨询:Java代码重复逻辑优化需求

嘿,看了你的代码片段,这个switch语句里确实堆了不少重复冗余的逻辑——每个case里都在做相似的判断、打印日志、添加Marker的操作,只是参数不一样对吧?咱可以从这几个方向优化,让代码更清爽、好维护:

方案1:提取重复逻辑到通用方法

把每个case里重复的代码抽成一个独立的方法,只把每个路由独有的参数(比如显示名称、图标资源ID、对应的坐标索引)传进去。这样switch里就只需要调用方法,代码一下子就简洁了。

示例代码:

// 先定义通用方法,把重复逻辑都放这里
private void addRouteMarker(String targetRoute, String displayName, int iconResId, String arrivalTime) {
    if (route.equals(targetRoute)) {
        System.out.println(displayName + " icon displayed.");
        Marker mCurrent = mMap.addMarker(new MarkerOptions()
                .position(start_location)
                .title("Arrival Time of Shuttle: " + arrivalTime)
                .icon(BitmapDescriptorFactory.fromResource(iconResId)));
        System.out.println("mCurrent location" + mCurrent.toString());
        // 把你后面未写完的if (!start_location.equals(end_location... 也放到这里
    }
}

// 优化后的switch语句
switch (listRoutes.get(i)) {
    case "A":
        addRouteMarker("A", "Red", android.R.drawable.btn_star_big_off, Coordinates[0]);
        break;
    case "B":
        // 假设B对应蓝色图标和Coordinates[1]
        addRouteMarker("B", "Blue", android.R.drawable.btn_star_big_on, Coordinates[1]);
        break;
    // 其他case同理,只需要传对应参数就行
}

方案2:用枚举封装路由配置

如果你的路由类型是固定的(比如只有A、B、C几种),用枚举来把每个路由的专属配置(显示名、图标、坐标索引)打包在一起,逻辑和配置分离,后续新增路由只需要加枚举值就行,非常方便。

示例代码:

// 定义枚举,封装每个路由的配置
enum RouteConfig {
    A("Red", android.R.drawable.btn_star_big_off, 0),
    B("Blue", android.R.drawable.btn_star_big_on, 1);
    // 新增路由直接在这里加枚举值

    private final String displayName;
    private final int iconResId;
    private final int coordinateIndex;

    RouteConfig(String displayName, int iconResId, int coordinateIndex) {
        this.displayName = displayName;
        this.iconResId = iconResId;
        this.coordinateIndex = coordinateIndex;
    }

    // getter方法
    public String getDisplayName() { return displayName; }
    public int getIconResId() { return iconResId; }
    public int getCoordinateIndex() { return coordinateIndex; }
}

// 优化后的代码
String currentRoute = listRoutes.get(i);
try {
    RouteConfig config = RouteConfig.valueOf(currentRoute);
    if (route.equals(currentRoute)) {
        System.out.println(config.getDisplayName() + " icon displayed.");
        Marker mCurrent = mMap.addMarker(new MarkerOptions()
                .position(start_location)
                .title("Arrival Time of Shuttle: " + Coordinates[config.getCoordinateIndex()])
                .icon(BitmapDescriptorFactory.fromResource(config.getIconResId())));
        System.out.println("mCurrent location" + mCurrent.toString());
        // 后续重复逻辑
    }
} catch (IllegalArgumentException e) {
    // 处理未知路由的情况
    System.out.println("Unknown route: " + currentRoute);
}

方案3:用Map做动态路由映射

如果路由可能是动态添加的(不是固定的几个),可以用Map来把路由名称和对应的配置对象关联起来,灵活性更高。这里的配置可以用普通的POJO类代替枚举。

示例代码:

// 先定义一个简单的POJO类存路由配置
class RouteConfig {
    private String displayName;
    private int iconResId;
    private int coordinateIndex;

    // 构造方法和getter
    public RouteConfig(String displayName, int iconResId, int coordinateIndex) {
        this.displayName = displayName;
        this.iconResId = iconResId;
        this.coordinateIndex = coordinateIndex;
    }

    public String getDisplayName() { return displayName; }
    public int getIconResId() { return iconResId; }
    public int getCoordinateIndex() { return coordinateIndex; }
}

// 在初始化的地方(比如onCreate)创建Map映射
Map<String, RouteConfig> routeConfigMap = new HashMap<>();
routeConfigMap.put("A", new RouteConfig("Red", android.R.drawable.btn_star_big_off, 0));
routeConfigMap.put("B", new RouteConfig("Blue", android.R.drawable.btn_star_big_on, 1));
// 动态添加路由只需put新的键值对

// 使用时的代码
String currentRoute = listRoutes.get(i);
RouteConfig config = routeConfigMap.get(currentRoute);
if (config != null && route.equals(currentRoute)) {
    System.out.println(config.getDisplayName() + " icon displayed.");
    Marker mCurrent = mMap.addMarker(new MarkerOptions()
            .position(start_location)
            .title("Arrival Time of Shuttle: " + Coordinates[config.getCoordinateIndex()])
            .icon(BitmapDescriptorFactory.fromResource(config.getIconResId())));
    System.out.println("mCurrent location" + mCurrent.toString());
    // 后续重复逻辑
}

这些优化方案的核心都是把重复的逻辑抽离出来,让可变的参数和固定的逻辑分离,不仅能减少代码量,以后维护的时候改逻辑只需要改一处,不用每个case都改,大大降低出错的概率~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:56:12