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

如何用Java枚举替代FillTable类中的switch语句?

用枚举替代switch语句优化getValueAt方法的实现方案

看起来你已经找对了方向——用枚举封装列的取值逻辑确实比switch更易维护,不过你的枚举还有几个小问题需要调整,我来一步步帮你搞定:

首先,先修正你的枚举设计:

  1. 原来的getData方法是void类型,但我们需要它返回对应的数据,所以得改成返回Object(如果所有返回值都是字符串,也可以改成String)。
  2. 枚举里没办法直接访问employeeData,所以得把这个对象作为参数传给getData方法。
  3. 另外,枚举的命名可以更语义化一点,去掉_INDEX后缀,直接用列名会更清晰,同时要注意你原来代码里的小不一致:switch里的ADDRESS_INDEX对应getAddress(),但枚举里写的是CONTRIBUTION_INDEX,这里要统一。

修改后的枚举如下:

public enum EmployeeTableColumn {
    NAME {
        @Override
        public Object getData(EmployeeData employeeData) {
            return employeeData.getName();
        }
    },
    DESCRIPTION {
        @Override
        public Object getData(EmployeeData employeeData) {
            return employeeData.getDescription();
        }
    },
    ADDRESS {
        @Override
        public Object getData(EmployeeData employeeData) {
            return employeeData.getAddress();
        }
    };

    // 抽象方法:接收EmployeeData实例,返回对应列的值
    public abstract Object getData(EmployeeData employeeData);

    // 新增工具方法:根据列索引获取对应的枚举实例
    public static EmployeeTableColumn fromColumnIndex(int col) {
        // 处理索引越界的情况,和原switch的default逻辑对应
        if (col < 0 || col >= values().length) {
            return null;
        }
        return values()[col];
    }
}

接下来修改FillTable类里的getValueAt方法,用枚举替代switch:

public class FillTable {
    // 原来的索引常量可以删掉了,因为枚举已经对应了索引顺序
    // private static final int NAME_INDEX = 0;
    // ...

    // 假设items是类里的集合成员
    private List<?> items;

    public Object getValueAt(int row, int col) {
        EmployeeData employeeData = (EmployeeData) items.get(row);
        // 根据列索引获取对应的枚举实例
        EmployeeTableColumn column = EmployeeTableColumn.fromColumnIndex(col);
        
        // 索引不合法时返回空字符串,和原逻辑一致
        if (column == null) {
            return "";
        }
        
        // 调用枚举的方法获取对应值,完全替代switch分支
        return column.getData(employeeData);
    }
}

这样修改后,代码的优势就体现出来了:

  • 后续新增列的时候,只需要在EmployeeTableColumn里添加新的枚举常量并实现getData方法,不用再修改getValueAt的代码,符合开闭原则。
  • 每个列的取值逻辑都封装在对应的枚举常量里,逻辑更清晰,也更容易维护。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 09:09:38