Ich habe ein Objekt, das ein paar Arrays als Felder hat. Es ist Klasse sieht ungefähr wie folgt aus:Generalisierte Methode, um ähnliche Objektattribute zu erhalten
public class Helper {
InsuranceInvoices[] insuranceInvoices;
InsuranceCollectiveInvoices[] insuranceCollectiveInvoices
BankInvoices[] bankInvoices;
BankCollectiveInvoices[] bankCollectiveInvoices;
}
Alle der Rechnungsarten haben einen gemeinsamen Marker Schnittstelle Rechnungen.
Ich muss alle Rechnungen abrufen, um eine andere Methode für sie aufzurufen.
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
Das Problem ist, dass alle Rechnungen nur die Marker-Schnittstelle gemeinsam haben. Die Methode getCustomerID() ist nicht durch eine gemeinsame Schnittstelle oder Klasse definiert. Dies ist ein Verhalten, das ich aufgrund einer vorgegebenen Spezifikation nicht ändern kann.
Die Code-Wiederholung innerhalb der for-each-Schleife ist etwas, das mich nervt. Ich muss genau dasselbe auf allen Rechnungsobjekten in den vier verschiedenen Arrays tun. Daher bohren vier for-each-loops, die unnötig sind, den Code auf.
Gibt es eine Möglichkeit, dass ich eine allgemeine (private) Methode schreiben kann? Eine Idee war:
private void generalMethod(Invoice[] invoiceArray){
// ...
}
Dies würde aber vier Instanceof Kontrollen erfordern, da die Klasse Rechnung nicht die Methode kennt getCusomterId(). Deshalb würde ich nichts gewinnen; Die Methode würde immer noch Wiederholungen enthalten.
Ich bin dankbar für jede mögliche Lösung, um dieses Problem zu verallgemeinern!
so alle Klassen implementieren 'Invoice' und alle implementieren' getCustomerId', aber ' getCustomerId' ist nicht in der 'Rechnung'-Schnittstelle? Sie müssen Reflection verwenden, um über Namen auf die Methode zuzugreifen und sie aufzurufen. An dieser Stelle ist die Schnittstelle "Rechnung" ziemlich nutzlos. – njzk2
Haben 'getInsuranceInvoices', 'getBankInvoices' ... alle vier die gleiche Anzahl an Rechnungen? – Rajesh
Ich habe einen Vorschlag ... wenden Sie ein Cluebat auf die Person an, die die "Rechnung" -Schnittstelle zu einer Markierschnittstelle gemacht hat, anstatt einer, die angibt, welche Methoden Rechnungen gemeinsam haben. – Powerlord