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

自定义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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 23:08:14