如何避免具有相同方法但没有公共接口的2个类的重复代码

时间:2018-12-21 13:32:51

标签: java generics

我的代码中有很多地方,我的方法与另一个地方相同,除了它们使用的对象不同,如下例所示:

private void applyContractualFields(){
 PaymentChangeMaintenanceFieldsV214Type recentPcmFieldType = getData();

 if (recentPcmFieldType != null) {
    paymentChangeMaintenance.setContractualFieldsApplied(true);
    if (recentPcmFieldType.getAnnualInterestRate() != null) {
        paymentChangeMaintenance.setContractualInterestRate(
                recentPcmFieldType.getAnnualInterestRate());
    }
    if (recentPcmFieldType.getPIAmount() != null) {
        paymentChangeMaintenance
                .setContractualPIAmount(recentPcmFieldType.getPIAmount());
    }
    paymentChangeMaintenance.setCountyTax(recentPcmFieldType.getCountyTaxAmount());
 }
}

private void applyPaymentDataFromPcmFields() {
 PaymentChangeMaintenanceCommonFieldsV214Type recentPcmFieldType = getData();

 if (recentPcmFieldType != null) {
    paymentChangeMaintenance.setContractualFieldsApplied(true);
    if (recentPcmFieldType.getAnnualInterestRate() != null) {
        paymentChangeMaintenance.setContractualInterestRate(
                recentPcmFieldType.getAnnualInterestRate());
    }
    if (recentPcmFieldType.getPIAmount() != null) {
        paymentChangeMaintenance
                .setContractualPIAmount(recentPcmFieldType.getPIAmount());
    }
    paymentChangeMaintenance.setCountyTax(recentPcmFieldType.getCountyTaxAmount(
 ));
 }
}

是否有一种使用泛型将两者结合的方法? 另外,PaymentChangeMaintenanceFieldsV214TypePaymentChangeMaintenanceCommonFieldsV214Type是从wsdl文件自动生成的类。

enter image description here

2 个答案:

答案 0 :(得分:2)

您可以创建一个Wrapper类,该类可以接受PaymentChangeMaintenanceFieldsV214TypePaymentChangeMaintenanceCommonFieldsV214Type(或此处的测试代码中的AB)并委托您对基础对象的调用。
每次收到AB的实例时,就构造一个Wrapper的实例并使用它。
这样,代码的重复就限于Wrapper内:

import java.util.Random;

public class Main {

    private final Random rand = new Random();

    public static void main(final String[] args) {
        new Main().test();
    }

    void test(){
        for (int i = 0; i < 10 ; i++){
            Object obj = getData();          //obj can be either A or B
            Wrapper w = new Wrapper(obj);    //construct a Wrapper 
            System.out.println(w.getName()); //use it 
        }
    }

    Object getData(){  //generate objects for testing 
        return rand.nextBoolean() ? new A() : new B(); // returns A half the times
    }
}

class Wrapper {

    Object obj;
    Wrapper(Object obj){ //throw an exception if obj is not an A or B 
        this.obj = obj;
    }

    String getName(){
        return obj instanceof A ? ((A)obj).getName() : ((B)obj).getName() ;
    }
}

//two classes implementing the same method without having a common interface 
class A {

    String getName() { return getClass().getSimpleName(); }
}

class B {

    String getName() { return getClass().getSimpleName(); }
}

通过创建适当的包装器,您可以通过更改一行来使方法接受两种类型:

 MyWrapper recentPcmFieldType = new MyWrapper(getData());

答案 1 :(得分:0)

我看到的唯一方法是使用反射。这是一个应根据传递的对象工作的示例。但是,您必须处理异常,最好检查传递的对象是什么类。

{{1}}