2014-09-21 5 views
0

Considérons une méthode qui produit différents types de résultats. Dans mon cas, il est soit un ArrayList ou un entier (pseudo code):Quel type de retour?

int a = ... // value for a comes from another function 

public ArrayList compute(){ // return either ArrayList or Integer 
    if(a==1){ 
     ArrayList result = new Arraylist() 
     for(int i=0; i<=something; i++){ 
      arr.add(...); 
     }  
    } 
    if(a==2){ 
     int result; 
     result = somethingElse; 
    } 
    return result; 
} 

En fonction du résultat de a, le résultat de result provient soit d'une boucle et charge les résultats dans un ArrayList, ou dans la deuxième cas, il sera juste un seul nombre.

De quel type devrait retourner la méthode?

+0

Vous pouvez retourner une liste '' ** et ** utilisation ' Collections.singletionList (int) 'pour le cas d'une valeur unique. Mais que feriez-vous avec ce résultat? – NoDataFound

Répondre

7

Renvoyer un List<Integer>. Pour un seul entier, renvoyez simplement une liste avec un seul élément.

-1

Vous pouvez changer la signature de la méthode pour qu'elle soit public Object compute(), afin que vous puissiez retourner les deux ArrayList s et Integer s, mais je ne sais pas exactement pourquoi vous voudriez faire cela.

Cela signifie simplement que chaque fois que vous appelez compute(), vous devrez vérifier le type de Object que vous avez reçu, par exemple.

Object result = compute(); 
if(result instanceof ArrayList) { 
    // Do ArrayList stuff 
} elseif(result instanceof Integer) { 
    // Do Integer stuff 
} 

Note: Object est super classe pour tous les objets Java, donc s'il y a un moment où vous pouvez retourner beaucoup de choses différentes, vous pouvez utiliser Object. Mais la meilleure solution peut être de créer une interface, si les choses que vous retournez ont quelque chose en commun.

Voir ici: http://docs.oracle.com/javase/tutorial/java/concepts/interface.html

+0

instanceof est une solution de dernier recours, et il y a beaucoup d'autres options ici ... – michael

+0

Je voulais juste répondre dans un sens plus général, s'il y avait un cas où quelqu'un voudrait avoir plus d'un type de retour différent. Mais dans ce cas particulier, la réponse de @Reimeus est la plus logique. – Fodder

+0

Plutôt que 'Object', pour atteindre le même, on créerait quelque chose comme' interface ComputeResult {boolean isList(); Liste getList(); int getValue(); ...} 'et que la méthode' compute' retourne un type de 'ComputeResult', juste pour éviter de mettre tout ce travail dans tous les clients; il y a aussi un gain de performance à faire en faisant cela. – michael

0

Une alternative à retourner une liste (mais « fonctionnellement » même),

public void compute(List<Integer> result){ 
    // add/remove/set the given list, 
} 

Et bien que cela ressemble à une mauvaise conception en général, vous pouvez dans ce cas retourne en fait une valeur qui indique si une "liste" ou une seule valeur (une liste avec un élément) est retournée.

public boolean compute(List<Integer> result){ ... 

Ou, mieux, la longueur de la liste (dépend de ce que vous êtes vraiment essayer d'atteindre):

public int compute(List<Integer> result){ 
    ... 
    return result.size(); 
}