【发布时间】:2015-06-18 13:17:13
【问题描述】:
我有一个对象,它有几个数组作为字段。它的类大致是这样的:
public class Helper {
InsuranceInvoices[] insuranceInvoices;
InsuranceCollectiveInvoices[] insuranceCollectiveInvoices
BankInvoices[] bankInvoices;
BankCollectiveInvoices[] bankCollectiveInvoices;
}
所有发票类型都有一个相互标记界面发票。
我需要获取所有发票才能对其调用另一种方法。
Helper helperObject = new Helper();
// ...
for (InsuranceInvoices invoice : helperObject.getInsuranceInvoices()) {
Integer customerId = invoice.getCustomerId();
// ...
}
for (BankInvoices invoice : helperObject.getBankInvoices()) {
Integer customerId = invoice.getCustomerId();
// ...
}
// repeat with all array fields
问题是所有发票只有共同的标记界面。 getCustomerID() 方法不是由相互接口或类定义的。由于给定的规范,这是我无法改变的行为。
for-each-loop 中的代码重复让我很头疼。我必须对四个不同数组中的所有发票对象执行完全相同的操作。因此,有四个 for-each-loop 不必要地使代码膨胀。
有没有办法可以编写通用(私有)方法?一个想法是:
private void generalMethod(Invoice[] invoiceArray){
// ...
}
但这需要四次 instanceof 检查,因为类 Invoice 不知道方法 getCusomterId()。因此,我将一无所获;该方法仍将包含重复。
我很感谢所有可能的解决方案来概括这个问题!
【问题讨论】:
-
那么,类都实现了
Invoice,也都实现了getCustomerId,但是getCustomerId不在Invoice接口中?您必须使用反射按名称访问方法并调用它。此时,Invoice接口已经相当没用了。 -
getInsuranceInvoices、getBankInvoices...是否都返回相同数量的发票? -
我有一个建议...向将
Invoice接口设为标记接口而不是指定发票共有哪些方法的人应用提示符。 -
我没有足够的能力提供完整的答案,但听起来您正在寻找鸭子打字:en.wikipedia.org/wiki/Duck_typing wiki 显示使用动态,并且有 c# 鸭子打字解决方案,但这可能不值得努力
-
@njzk2 没错。反思可能是一种方法,但它通常被认为是一种“肮脏”,不是吗?
标签: java generalization