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

