Java - Meilleure façon de renvoyer plusieurs types d'objet à partir d'une méthode
Dans mon DAO, j'ai une méthode où je créer 2 objets différents et je veux retourner à la fois de ces objets, mais je ne suis pas sûr de ce que le meilleur moyen est de le faire. J'ai regardé à l'aide de ? extends myObject
, la création d'une autre classe qui détient à la fois de mes objets que je veux renvoyer, et seulement à l'aide de List<Object>
.
Longue histoire courte sur pourquoi j'ai besoin de ces objets similaires affiche 1 à l'écran et l'autre à utiliser avec primefaces dataexporter qui ne gère pas les listes dans un objet aussi loin que je suis au courant.
Personne De La Classe
public class Person() {
firstName = null;
lastName = null;
List<Programs> programs = new ArrayList<Programs>();
//Getters and setters
}
Classe DataExporterPerson
public class DataExporterPerson() {
firstName = null;
lastName = null;
String program = null;
//Getters and setters
}
Méthode DAO:
public List<SOMETHING> getPeople() {
//query db for people
//build both objects
return ?????
}
Maintenant, je comprends que je peux très facilement créer un autre objet comme celui-ci, mais cela semble être une mauvaise façon de faire les choses parce que je suis fondamentalement de la création d'un objet juste de retour de la méthode 1.
public class PersonTransporter() {
Person person = null;
DataExporterPerson = null;
}
Quelle est la meilleure façon de gérer ce scénario?
MODIFIER
La raison que je suis en train de retourner 2 objets dans la méthode 1 est parce que c'est une méthode DAO qui interroge la base de données et génère 2 objets en se basant sur les données de la requête. Je ne veux pas le casser en 2 méthodes, car je ne veux pas de requête de la db à deux fois si je n'ai pas besoin d'.
DataExporterPerson
pas extends Person
? Ensuite, vous pouvez utiliser un Collection<Person>
.Je vais juste le lien vers cette SORTE de réponse concernant l'absence de la Paire en Java: stackoverflow.com/questions/156275/...
C'est généralement une mauvaise idée pour une méthode unique de faire deux choses. Pouvez-vous comprendre pourquoi une méthode il faut deux valeurs de retour?
Il ne peut pas faire deux choses; il peut faire une chose et de revenir à 2-tuple.
Question mise à jour avec la raison pour essayer de le retourner 2 objets dans la méthode 1.
OriginalL'auteur Catfish | 2013-08-09
Vous devez vous connecter pour publier un commentaire.
Vous pouvez gérer cela, par héritage, ou de confinement.
Vous pouvez avoir
Person
etDataExporterPerson
étendre quelque chose commeAbstractPerson
. Cependant, comme vous ne l'avez pas déjà fait, alors il est probablement inapproprié de faire de l'héritage.Je pense que c'était Effective C++ qui est le plus parlé de la façon dont le confinement est mieux que l'héritage. SI la raison invoquée est que le confinement est couplée de manière plus lâche que de l'héritage.
Ici vous avez un objet qui contient à la fois
Person
etDataExporterPerson
. Votre méthode remplir l'un de ceux pour ce type d'union de l'objet, et par voir lequel des deux est nul, vous savez celui qui vous fait avoir.Même si j'ai
Perso
n etDataExporterPerso
n étendreAbstractPerson
, comment pourrait-il m'aider parce que j'ai toujours le besoin de revenir à la foisPerson
etDataExporterPerson
de ma méthode DAO.OriginalL'auteur Pete B.
Si votre méthode de besoin de retourner deux types différents c'est un indice qu'il ya quelque chose de mal avec votre architecture ou de la logique de la méthode.
Ce que vous pouvez faire ?
L'exemple pour le dernier point
Puis le problème comment faire pour retourner un objet Foo et Bar ?
De la validité de la mise en œuvre
Utilisation
J'espère que maintenant je clair.
OriginalL'auteur Damian Leszczyński - Vash
Votre problème ici est celui de la conception. Aucune méthode devrait être plus que d'une chose: donc une méthode qui retourne deux à la différence des objets, c'est probablement une mauvaise conception. Pour réellement résoudre ce problème, vous devez rompre votre méthode en deux, séparé des méthodes pour gérer les deux préoccupations différentes.
Cependant, nous supposons que vous ne pouvez pas faire cela. Basé sur vos notes, il semble que la plupart de votre état dans les deux objets est répété. Vous pouvez combiner ces deux grâce à l'héritage à partir d'une source similaire - mais cela ne résout que la moitié de votre problème. Au lieu de cela, vous pouvez décorer l'un avec l'autre:
Si vous devez absolument retourner deux objets, vous pouvez le faire, mais il est difficile de test et viole le " pas de côté l'effet de principe:
ThingA
etThingB
sont dans mon backing bean, et ma méthode est à mon DAO.Ensuite vous posez une autre question tout à fait de " comment puis-je retourner les deux objets à partir d'une méthode?'.
Pas vraiment. J'ai classA.methodA appel ClassB.methodA, je suis en train de retourner plusieurs objets de ClassB.la méthode.
Ok, la première partie ne sera probablement gérer ce dont vous avez besoin. Votre question, cependant, est violemment obscure: et c'est un bon signe que votre conception est waaay off. Je ne pense pas que jamais vous voulez vraiment revenir deux objets. Il y a simplement de meilleures alternatives. Dans ce cas, vous voulez de la décoration.
OriginalL'auteur Nathaniel Ford
Vous pourriez faire deux choses différentes.
Le premier la signature de la méthode être
public List<Object> getPeople()
. Cela vous permettra de faireinstanceof
et de comprendre qui est qui.OU
vous pourriez avoir
DataExporterPerson
étendrePerson
(ou une nouvelle classe/interface que les deuxDataExporterPerson
etPerson
étendre/met en œuvre et de l'utiliser comme type).OriginalL'auteur Brinnis