自定义JTable适配多TableModel:寻求替代instanceof的优化方案
优化TooltipsTable中getRowCount方法的实现方式
我们有一个继承自JTable的自定义类TooltipsTable,它实现了仅在单元格显示省略号时触发动态工具提示的功能,需要适配应用内11种不同的TableModel。当前重写getRowCount方法时,通过instanceof逐个判断TableModel类型并强转后调用对应方法,这种写法冗余且不易维护,以下是几种更简洁灵活的替代方案:
原代码示例
public class TooltipsTable extends JTable { @Override public String getToolTipText(MouseEvent e) { // will post if requested } @Override public int getRowCount() { int result = 0; TableModel tm = getModel(); if (tm instanceof BrowserTableModel) { BrowserTableModel btm = (BrowserTableModel) getModel(); result = btm.getRowCount(); } else if (tm instanceof DefaultTableModel) { DefaultTableModel dtm = (DefaultTableModel) getModel(); result = dtm.getRowCount(); } // ... 其余9种TableModel的判断逻辑 return result; } }
方案1:直接复用父类实现(最优解)
所有TableModel都继承自javax.swing.table.TableModel接口,该接口已定义getRowCount()方法,JTable父类本身的getRowCount就已经实现了调用模型的对应方法:
public int getRowCount() { return getModel() == null ? 0 : getModel().getRowCount(); }
因此你完全不需要重写getRowCount方法,直接删除这段重写代码即可。如果一定要显式重写(比如后续有扩展需求),也可以简化为:
@Override public int getRowCount() { return super.getRowCount(); }
方案2:策略模式适配特殊场景
如果部分自定义TableModel的getRowCount存在特殊逻辑(不符合标准接口实现),可以用策略模式替代冗长的if-else判断:
public class TooltipsTable extends JTable { // 存储不同TableModel对应的行计数处理器 private final Map<Class<? extends TableModel>, Function<TableModel, Integer>> rowCountHandlers = new HashMap<>(); public TooltipsTable() { // 初始化各模型的处理器 rowCountHandlers.put(BrowserTableModel.class, model -> ((BrowserTableModel) model).getRowCount()); rowCountHandlers.put(DefaultTableModel.class, model -> ((DefaultTableModel) model).getRowCount()); // 其他9种模型的处理器配置... } @Override public String getToolTipText(MouseEvent e) { // 现有逻辑 } @Override public int getRowCount() { TableModel model = getModel(); if (model == null) return 0; // 优先使用对应处理器,无匹配则用默认逻辑 return rowCountHandlers.getOrDefault(model.getClass(), TableModel::getRowCount).apply(model); } }
后续新增TableModel时,只需在构造方法中添加一行处理器配置,无需修改条件判断代码,扩展性更强。
内容的提问来源于stack exchange,提问作者Todd Hill
相关产品推荐
相关产品推荐

