如何用Java枚举替代FillTable类中的switch语句?
用枚举替代switch语句优化getValueAt方法的实现方案
看起来你已经找对了方向——用枚举封装列的取值逻辑确实比switch更易维护,不过你的枚举还有几个小问题需要调整,我来一步步帮你搞定:
首先,先修正你的枚举设计:
- 原来的
getData方法是void类型,但我们需要它返回对应的数据,所以得改成返回Object(如果所有返回值都是字符串,也可以改成String)。 - 枚举里没办法直接访问
employeeData,所以得把这个对象作为参数传给getData方法。 - 另外,枚举的命名可以更语义化一点,去掉
_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
相关产品推荐
相关产品推荐

