Get / Set - Methode für verschiedene Entities? (generisch)

beta20

Top Contributor
Hallo,

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()...

Kann mir jemand helfen?
 
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.
 
Indem du statisch sicherstellst, dass die Methode eben nur mit Objekten aufgerufen werden kann, deren Klasse WithDirectoryPath implementiert...
Java:
public void uploadDocument(WithDirectoryPath object) {
  storageAttachment.setFullPath(object.getDirectoryPath());
}
 
Ok, und in Customer etc. brauche ich nichts anderes als:
implements WithDirectoryPath ?
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.
 
Verstehe ich das nun so richtig....

1) Ich baue mir ein Interface:
Java:
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?
 
Zuletzt bearbeitet:
Ja, aber das ist ja genau mein Problem...

ich möchte mit mit einem "Object" den Wert von getId() zB bekommen....

Java:
public void findId(Object object) {
   String id = ????
}

Ich kann nun natürlich, das machen:
Java:
if(object instanceof Customer){
   Customer customer = (Customer) object;
   customer.getId();
}

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....
 
ja, selbst wenn ich:
Java:
public void findId(EntityPropertyFinder entityPropertyFinder) {
   String id = entityPropertyFinder.getId();
}

Irgendwo muss ich doch definieren, dass ich die ID von "Customer" will und nicht die von "Angebot"
 
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");
  }
}

Ausführen und staunen.
 
ah, ok nun habe ich den Aufruf verstanden, danke....

Eine weitere Frage habe ich noch...
Kann ich auch die Properties bekommen, die in jeder Klasse so enthalden sind, also Name = ENTITY_NAME

public
static final String ENTITY_NAME = "CUSTOMER";

oder muss ich das in eine Methode packen:
1) Im Interface dann getEnityName()

2) In den einzelnen Klassen dann:
Java:
@Override
String getEnityName() {
   return "CUSTOMER";
}
 

Zurück
Oben