避免在具有不同类型参数的方法中重复

问题描述 投票:0回答:2

我有两个自动生成的类,这些类具有相同的参数和方法,我们称它们为 ClassA 和 ClassB。我需要将此自动生成的类转换为内部模型,因此我创建了convertToInternal(ClassA) 和convertToInternal(ClassB),但映射过程被检测为重复的代码。这是因为ClassA和ClassB是完全一样的,都需要映射到同一个内部模型。我可以更改方法名称,但这对解决重复代码错误没有帮助。

由于 ClassA 和 ClassB 都是自动生成的(并且都是公司规则所必需的),因此我无法修改它们。

如何分解这些方法以避免重复代码,并且既不使用父类也不使用接口?

我使用的是java 17。

检测到的重复方法有:

public InternalModel convertToInternal(ClassA obj){
    InternalModel rtn = new InternalModel();
    rtn.setId(obj.getId());
    rtn.setName(obj.getName());
    rtn.setOrg(obj.getOrg());
    ...
    return rtn;
}

public InternalModel convertToInternal(ClassB obj){
    InternalModel rtn = new InternalModel();
    rtn.setId(obj.getId());
    rtn.setName(obj.getName());
    rtn.setOrg(obj.getOrg());
    ...
    return rtn;
}
java duplicates overloading
2个回答
0
投票

假设这两个类不共享公共接口, 您可以创建一个以对象作为参数的方法

public InternalModel convertToInternal(Object o){

    if (o instanceof ClassA) {
        ClassA obj = (ClassA) o; 
        InternalModel rtn = new InternalModel();
        rtn.setId(obj.getId());
        rtn.setName(obj.getName());
        rtn.setOrg(obj.getOrg());
        return rtn;
    }
    if (obj instanceof ClassB) {
        // etc
    }

请参阅https://www.baeldung.com/java-instanceof-alternatives了解instanceof的替代方案


0
投票

如何分解这些方法以避免重复代码,并且既不使用父类也不使用接口?

既然你规定这两个类不是多态的并且不能做成多态,那么就没有什么好的方法来去除词法重复。这是因为它“只是”词汇上的,而不是语义上的重复。尽管两个方法体中调用的方法具有相同的名称,甚至相同的参数类型,但它们是不同的方法,因为它们属于不同的、不相关的类型。 除非您可以完全禁用重复检查器(我怀疑这很难推销),否则最好的选择是利用重复检查器的某些功能来禁用受影响的方法或受影响的类。例如,查看它是否支持通过注释或特殊格式的注释接收本地化指令。

如果有必要,由于分析似乎是纯粹的词汇分析,你可能可以通过足够的词汇变化来欺骗它,例如:

在每个方法的主体中添加不同的普通注释
  • 在其中一种方法中更改参数名称
  • 重新排序方法体中的语句(只要可以这样做而不会造成破坏)
© www.soinside.com 2019 - 2024. All rights reserved.