In meinem DAO habe ich eine Methode, bei der ich zwei verschiedene Objekte erstelle und diese beiden Objekte zurückgeben möchte, aber ich bin nicht sicher, was der beste Weg ist, es zu tun. Ich habe mit ? extends myObject
gesucht, eine andere Klasse erstellt, die beide meiner Objekte enthält, die ich zurückgeben möchte, und einfach List<Object>
verwenden.
Lange Geschichte kurz, warum ich diese ähnlichen Objekte brauche, ist 1 auf dem Bildschirm anzuzeigen und die andere mit primefaces dataexporter zu verwenden, die Listen in einem Objekt nicht behandelt, soweit mir bekannt ist.
Klassenperson
%Vor%Class DataExporterPerson
%Vor%DAO-Methode:
%Vor%Jetzt verstehe ich, dass ich sehr leicht ein anderes Objekt wie das folgende erstellen kann, aber das scheint eine ineffiziente Art zu sein, Dinge zu tun, weil ich im Grunde ein Objekt erzeuge, nur um von einer Methode zurückzukehren.
%Vor%Was ist der beste Weg, um mit diesem Szenario umzugehen?
BEARBEITEN
Der Grund, warum ich versuche, zwei Objekte in einer Methode zurückzugeben, liegt daran, dass dies eine DAO-Methode ist, die die Datenbank abfragt und zwei Objekte basierend auf den Daten in der Abfrage erstellt. Ich möchte es nicht in zwei Methoden aufteilen, weil ich die db nicht zweimal abfragen möchte, wenn ich nicht brauche.
Sie können dies entweder durch Vererbung oder Eindämmung behandeln.
Sie können Person
und DataExporterPerson
etwas wie AbstractPerson
erweitern lassen. Da Sie dies jedoch noch nicht getan haben, ist es wahrscheinlich unpassend, die Vererbung durchzuführen.
Ich denke, es war effektives C ++, das darüber sprach, wie Containment besser ist als Vererbung. IIRC der angegebene Grund ist, dass Containment lose als Vererbung gekoppelt ist.
Hier hätten Sie ein Objekt, das sowohl Person
als auch DataExporterPerson
enthält. Ihre Methode würde einen dieser für dieses Unionstyp-Objekt auffüllen, und indem Sie sehen, welcher Null ist, würden Sie wissen, welchen Sie tatsächlich haben.
Wenn Ihre Methode zwei verschiedene Typen zurückgeben muss, ist dies ein Hinweis darauf, dass mit Ihrer Architektur- oder Methodenlogik etwas nicht stimmt.
Was können Sie tun?
Das Beispiel für den letzten Punkt
%Vor%Dann Problem, wie Objekt Foo und Bar zurückgeben?
%Vor%Die gültige Implementierung
%Vor%Verwendung
%Vor%Ihr aktuelles Problem ist hier das Design. Keine Methode sollte mehr als eine Sache tun: Daher ist eine Methode, die zwei ungleiche Objekte zurückgibt, wahrscheinlich ein schlechtes Design. Um dieses Problem tatsächlich zu lösen, sollten Sie Ihre Methode in zwei getrennte Methoden aufteilen, um die zwei unterschiedlichen Probleme zu behandeln.
Nehmen wir jedoch an, Sie können das nicht tun. Basierend auf Ihren Notizen scheint es, dass der größte Teil Ihres Zustands in den zwei Objekten wiederholt wird. Sie können diese beiden kombinieren, indem Sie sie von einer ähnlichen Quelle erben - aber das löst nur die Hälfte Ihres Problems. Stattdessen können Sie das eine mit dem anderen dekorieren:
%Vor%Wenn Sie unbedingt zwei Objekte zurückgeben müssen, können Sie dies tun, aber es ist schwer zu testen und verletzt das Prinzip "keine Nebenwirkung":
%Vor%Sie könnten zwei verschiedene Dinge tun.
Als erstes muss die Methodensignatur public List<Object> getPeople()
sein. Dies ermöglicht es Ihnen, instanceof
zu tun und herauszufinden, welches was ist.
ODER
Sie könnten DataExporterPerson
erweitern Person
haben (oder eine neue Klasse / Schnittstelle erstellen, die sowohl DataExporterPerson
als auch Person
erweitern / implementieren und diese als Typ verwenden).
Tags und Links java inheritance design containment