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

如何简洁实现多参数重载方法?避免重复定义同名方法

解决方案:避免重复编写参数不同但逻辑相同的方法

当然不用复制粘贴三次啦!这种“逻辑完全一致、仅参数类型不同”的场景,咱们有好几种简洁写法来避免重复代码,下面给你推荐最实用的几个方案:

方案1:提取公共逻辑到私有方法(最推荐)

核心思路是把重复的业务逻辑抽成一个独立的私有方法,然后让各个重载的公共方法只负责传递参数,这样后续不管加多少个类似的Extractor类型,只需要加一行调用代码就行。

先写通用的私有逻辑方法:

private String extractLogNumber(String text) {
    String logNumber = "";
    if (text.contains("Log ")) {
        int logIndex = text.indexOf("Log ") + 4;
        int logIndexEnd = logIndex + 5;
        logNumber = text.substring(logIndex, logIndexEnd);
    }
    return logNumber;
}

然后原来的两个方法就可以简化成:

public String findLogNumber(XWPFWordExtractor we) {
    return extractLogNumber(we.getText());
}

public String findLogNumber(WordExtractor we) {
    return extractLogNumber(we.getText());
}

剩下的两个方法也照这个模式写,一行代码搞定,以后要修改逻辑的话,只需要改extractLogNumber这一个地方,维护起来超省心。

方案2:利用泛型(如果有共同父类/接口)

如果你的四个Extractor类都实现了同一个包含getText()方法的接口(比如自定义一个TextExtractable接口),或者都继承自某个父类,那可以用泛型方法来统一处理:

首先定义接口(如果没有的话):

public interface TextExtractable {
    String getText();
}

让你的XWPFWordExtractor和WordExtractor都实现这个接口(如果是第三方类无法修改的话,这个方案就不太适用了)。

然后写泛型方法:

public <T extends TextExtractable> String findLogNumber(T extractor) {
    String text = extractor.getText();
    String logNumber = "";
    if (text.contains("Log ")) {
        int logIndex = text.indexOf("Log ") + 4;
        int logIndexEnd = logIndex + 5;
        logNumber = text.substring(logIndex, logIndexEnd);
    }
    return logNumber;
}

这样不管传哪种实现了TextExtractable的Extractor,这个方法都能处理,不需要写多个重载方法。

方案3:函数式接口(Java 8+)

如果不想定义额外的接口,也可以用Java 8的Supplier函数式接口来传递获取文本的逻辑:

public String findLogNumber(Supplier<String> textSupplier) {
    String text = textSupplier.get();
    String logNumber = "";
    if (text.contains("Log ")) {
        int logIndex = text.indexOf("Log ") + 4;
        int logIndexEnd = logIndex + 5;
        logNumber = text.substring(logIndex, logIndexEnd);
    }
    return logNumber;
}

调用的时候直接用方法引用传递getText():

// 传入XWPFWordExtractor实例
findLogNumber(xwpfExtractor::getText);
// 传入WordExtractor实例
findLogNumber(wordExtractor::getText);

这个方式比较灵活,但可读性稍微弱一点,如果是团队协作的话,可能需要注释说明一下。

总的来说,方案1是最适合你的场景——简单直接,不需要额外的接口或泛型知识,代码可读性高,维护成本低,完全满足你“只写核心逻辑一次”的需求。

内容的提问来源于stack exchange,提问作者dsafas fsafasfsa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:32:12