Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Get / Set - Methode für verschiedene Entities? (generisch)
ich habe verschiedene Entities (Kunde, Angebot etc.).
Jede dieser Entites hat aber das gleiche Property (zB. String directoryPath).
Wie schaffe ich es die Get - Methode von jeder Entity dynamisch zu bekommen, ohne, dass ich explizit zB customer.getDirectoryPath() oder offer.getDirectoryPath() nutzen muss?
Also sowas wie genericObject.getDirectoryPath()...
Wenn du die Klassenhierarchie anpassen kannst, dann z.B.:
Java:
public interface WithDirectoryPath {
String getDirectoryPath();
}
public class Kunde implements WithDirectoryPath {...}
public class Angebot implements WithDirectoryPath {...}
Und dann eben die Methode auf einem `WithDirectoryPath` aufrufen.
Aber erzähl' vielleicht erstmal, welches konkrete darunterliegende Problem du eigentlich lösen willst, statt nach der Umsetzung der von dir vermuteten, besten Lösung zu fragen (nämlich, die Methoden irgendwie generisch aufzurufen).
Naja, es geht mir darum, dass ich anstatt für jede Entity eine Methode schreibe, die das gleiche macht, nur eine zentrale habe.
Der einzige Unterschied der Methode ist, dass ich auf die Property "directoryPath" zugreifen muss je Entity.
Dies hindert mich gerade noch daran, dass ich eine zentrale Methode habe....
Im Moment habe ich für jede Entity diese Methode, um den Pfad zu bekommen
Java:
public void uploadDocument(Customer customer) {
// Do Something
storageAttachment
.setFullPath(customer.getDirectoryPath());
//
}
Ich hätte aber gerne sowas:
]
Java:
public void uploadDocument(Object object) {
// Do Something
storageAttachment.setFullPath(object.getDirectoryPath());
}
Ja gut, wenn diese uploadDocument() Methode nur Objekte entgegen nehmen kann/darf, die auch getDirectoryPath() haben, dann kannst du ja eben genau den vorgeschlagenen Weg mit der statischen Typhierarchie bzw. dem Interface gehen.
Wenn du zur Compilezeit nicht weisst, ob die Klasse des übergebenen Objektes tatsächlich das Interface implementiert oder die Methode aufruft, musst du das natürlich erstmal zur Laufzeit testen und dann entsprechend den Fall behandeln, wenn dem nicht so ist.
Und die Implementierung davon. Die musst du in jedem 1x machen (aber das ist - genauso wie das Field anlegen ja fix gemacht).
Alternativ könntest du anstelle eines Interfaces eine abstrakte Basisklasse verwenden - sofern die Vererbungshierachie das zulässt. Finde ich persönlich aber eher unsauber.
Und wenn du ganz Faul bist, kannst du dir mal Project lombok ansehen - das generiert die getter/setter automatisch.
public interface EntityPropertyFinder {
Long getId();
}
2) Füge das bei allen Klassen hinzu:
public class Kunde implements EntityPropertyFinder {...}
public class Angebot implements EntityPropertyFinder {...}
Wenn ich nun die ID bekommen möchte, dann rufe ich das so auf:
EntityPropertyFinder entityPropertyFinder;
entityPropertyFinder.getId();
Der letzte Punkt ist mir noch nicht ganz klar, wie der Aufruf dann aussieht? Passt der Aufruf so?
Aber wenn ich nun 100 Entities habe, möchte ich nicht 100x diesen Code schreiben...
Ich hätte daher gerne die getId() auf dem "object"... Object kann dann Customer, Angebot etc. sein....
Stichwort "dynamic dispatching" (keyfeature of OOP):
Java:
identify(new Customer());
identify(new Boss());
Java:
public void identify(Identity identity) {
identity.identify();
}
Java:
class Customer implements Identity {
@Override
public void identify() {
System.out.println("I identify as customer");
}
}
class Boss implements Identity {
@Override
public void identify() {
System.out.println("I'm the boss");
}
}