J'ai besoin de renvoyer 2 valeurs d'une méthode. Mon approche est la suivante:
La seule chose qui sera modifiée dans la méthode est qu'à la fin il assignera ces 2 valeurs aux champs de l'instance. Ensuite, je peux aborder ces valeurs en faisant référence aux champs de cet objet.
Est-ce un bon design et pourquoi?
Je dirais cela selon les lignes suivantes:
Pour résumer, je verrais si je peux transformer cet "objet de données" en une classe à part entière avec à la fois des données et un comportement. Comme commentaire supplémentaire, vous souhaiterez peut-être rendre la classe immuable, car son état est défini une fois. Le rendre immuable aidera à éviter qu'il ne soit mal défini ou modifié ultérieurement (par exemple, quelqu'un définissant l'un des champs sur null et le transmettant).
Edit: Comme Patkos Csaba le souligne correctement, le principe appliqué ici est le principe de responsabilité unique ( SRP ) - la classe que vous essayez de créer devrait vraiment avoir une responsabilité (définie comme une raison de changement ). Cette directive de conception devrait vous aider à déterminer si vos deux champs appartiennent ou non à une seule classe. Pour s'en tenir à l'exemple de Wikipédia, votre classe pourrait être considérée comme un type de rapport, auquel cas il est conforme à SRP, mais il est difficile de commenter sans plus d'informations.
Il y a le concept d'un Tuple qui est présenté dans d'autres langages, comme Python.
On pourrait retourner une instance de cette classe générique qui est facilement réutilisable:
public class TypedTuple<L, R> implements Serializable {
private static final long serialVersionUID = 1L;
protected L left;
protected R right;
protected TypedTuple() {
// Default constructor for serialization
}
public TypedTuple(L inLeft, R inRight) {
left = inLeft;
right = inRight;
}
public L getLeft() {
return left;
}
public R getRight() {
return right;
}
}
Il semble que cette classe enlève des responsabilités à une autre classe, et cela me fait penser que ce design n'est pas génial.
Pour une méthode qui renvoie des valeurs multibles, je préfère
ou
Exemple pour la deuxième option:
public Class FooBarRetval {
private String foo;
private int bar;
public FooBarRetval (String foo, int bar) {
this.foo = foo;
this.bar = bar;
}
public String getFoo() {
return foo;
}
public int getBar() {
return bar;
}
}
Placer plusieurs valeurs de retour d'une méthode dans sa propre classe/structure est souvent utilisé dans systèmes basés sur les messages qui ont une classe pour Demande et réponse . Un exemple de ceci est Simple Object Access Protocol (SOAP) .
Est-ce un bon design et pourquoi?
Au moins, c'est assez courant. Si c'est bon ou mauvais dépend de votre cas d'utilisation spécial.
Réponse courte: vous pouvez renvoyer un tableau ou une liste avec les deux valeurs.
Personnellement, j'écrirais deux méthodes distinctes, comme
int x = obj.getX();
int y = obj.getY();