我的代码中有很多地方,我的方法与另一个地方相同,除了它们使用的对象不同,如下例所示:
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(
));
}
}
是否有一种使用泛型将两者结合的方法?
另外,PaymentChangeMaintenanceFieldsV214Type
和PaymentChangeMaintenanceCommonFieldsV214Type
是从wsdl文件自动生成的类。
答案 0 :(得分:2)
您可以创建一个Wrapper
类,该类可以接受PaymentChangeMaintenanceFieldsV214Type
或PaymentChangeMaintenanceCommonFieldsV214Type
(或此处的测试代码中的A
和B
)并委托您对基础对象的调用。
每次收到A
或B
的实例时,就构造一个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}}