Java - Der beste Weg, um mehrere Objekttypen von einer Methode zurückzugeben [geschlossen]

8

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.

    
Catfish 09.08.2013, 16:36
quelle

4 Antworten

8

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.

%Vor%     
Pete B. 09.08.2013, 16:41
quelle
5

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?

  • Erstellen Sie eine Klasse, die die Elemente logisch verbindet,
  • Einführung einer gemeinsamen Schnittstelle, die von beiden Klassen implementiert wird,
  • Implementieren Sie zwei Methoden fist return mit object, die zweiten einen Parameter verwenden und das zweite Objekt zurückgeben.

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%     
quelle
2

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%     
Nathaniel Ford 09.08.2013 16:52
quelle
-2

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

    
Brinnis 09.08.2013 16:41
quelle