如何简洁实现多参数重载方法?避免重复定义同名方法
当然不用复制粘贴三次啦!这种“逻辑完全一致、仅参数类型不同”的场景,咱们有好几种简洁写法来避免重复代码,下面给你推荐最实用的几个方案:
方案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

