gpt4 book ai didi

java - 获取相似对象属性的通用方法

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:41:39 25 4
gpt4 key购买 nike

我有一个对象,它有一些数组作为字段。它的类大致如下所示:

public class Helper {
InsuranceInvoices[] insuranceInvoices;
InsuranceCollectiveInvoices[] insuranceCollectiveInvoices
BankInvoices[] bankInvoices;
BankCollectiveInvoices[] bankCollectiveInvoices;
}

所有发票类型都有一个共同的标记接口(interface)发票
我需要获取所有发票才能对它们调用另一种方法。

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

问题是所有发票只有标记接口(interface)是共同的。 getCustomerID() 方法不是由相互接口(interface)或类定义的。由于给定的规范,这是我无法更改的行为。

for-each-loop 中的代码重复让我很烦恼。我必须对四个不同数组中的所有发票对象执行完全相同的操作。因此,四个 for-each-loops 不必要地使代码膨胀。

有没有办法可以编写通用(私有(private))方法?一个想法是:

private void generalMethod(Invoice[] invoiceArray){
// ...
}

但这需要四次 instanceof 检查,因为类 Invoice 不知道方法 getCusomterId()。因此,我将一无所获;该方法仍将包含重复。

我感谢所有可能的解决方案来概括这个问题!

最佳答案

概括问题的可能解决方案(从最好到最差排序):

使用包装类

public class InvoiceWrapper {
private String customerID;
public String getCustomerID() {
return customerID;
}
public InvoiceWrapper(BankInvoices invoice) {
this.customerID = invoice.getCustomerID();
}
public InvoiceWrapper(InsuranceInvoices invoice) {
this.customerID = invoice.getCustomerID();
}
// other constructors
}

Upd 如果我理解正确,您需要对所有数组中的 ID 做一些事情。要使用 InvoiceWrapper,您还需要在 Helper 类中实现迭代器,它将遍历数组并为每个条目返回一个包装器。因此,无论如何,您将拥有适用于 4 个数组的代码。

使用强制转换实例

public class CustomerIdHelper {
public static String getID(Invoice invoice) {
if (invoice instanceof InsuranceInvoices) {
return ((InsuranceInvoices) invoices).getCustomerID();
} else if ...
}
}

通过反射按名称调用方法

public class CustomerIdHelper {
public static String getID(Invoice invoice) {
Method method = invoice.getClass().getDeclaredMethod("getCustomerId");
return (String) method.invoke(invoice);
}
}

关于java - 获取相似对象属性的通用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30916455/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com