2012-07-20 1 views
2

J'essaye d'écrire une fonction Java qui a un objet List comme paramètre de sortie.Liste en tant que paramètre de sortie en Java

boolean myFunction(int x, in y, List myList) 
{ 
    ...Do things... 
    myList=anotherList.subList(fromIndex, toIndex); 
    return true 
} 

Avant que j'appelle la fonction que je déclare myList comme suit: Liste myList = null; Puis j'appelle la fonction myFunction (x, y, myList) Mais quand j'essaye de manipuler myList, je trouve que myList est toujours nul.

Je suis sûr que la variable "antherList" dans mon code de fonction n'est pas nulle et je suis sûr que la fonction subList retourne une liste non vide.

Quelle est la raison, et comment peut-on faire passer un paramètre List comme sortie dans une fonction Java? Merci beaucoup.

Répondre

4

Java utilise toujours la valeur de passage. Cela signifie que la manipulation d'une variable passée n'affectera pas la variable qui a été transmise par l'appelant.

Afin de résoudre votre problème il y a quelques possibilités:

  • Retour la sous-liste:

    List myFunction(int x, int y) { return anotherList.subList(....);} 
    

    Je sais que cette façon se débarrasse de votre valeur de retour booléenne.

  • Créez une structure qui contient le pointeur sur la liste et.

    class Reference <T> 
    { 
        public T ref; 
    } 
    
    boolean myFunction(int x, int y, Reference<List> listRef) 
    { 
         listRef.ref = anotherList.subList(....); 
         return true; 
    } 
    
  • Créer une structure qui tient toute la sortie que vous voulez que la méthode pour revenir:

    class MyFunctionOutput 
    { 
        List list; 
        boolean b; 
    } 
    
    MyFunctionOutput myFunction(int x, int y) 
    { 
        MyFunctionOutput out = new MyFunctionOutput(); 
        out.list = anotherList.subList(....); 
        out.b = true; 
        return out; 
    } 
    
  • Ou la façon la plus simple: passer d'une liste initialisées au lieu de null et laissez la fonction ajouter la sous-liste, comme l'a suggéré Attila.

+0

Super Martjin, merci beaucoup! – Rami

4

Vous ne pouvez pas passer un hors paramètre en Java. Vous devrez soit d'indiquer le type de retour que la liste ou modifier les contenu de la liste passée:

boolean myFunction(int x, in y, List myList) 
{ 
    ...Do things... 
    myList.clear(); 
    myList.addAll(anotherList.subList(fromIndex, toIndex)); 
    return true 
} 

Remarque: hors paramètre signifie que vous modifiez la valeur de la variable contenant la valeur passée à la fonction. Dans votre cas, cela signifierait renvoyer un objet List différent. Au lieu de cela, vous renvoyez le même objet liste, mais avec un contenu modifié. Pensez au paramètre comme une copie locale de la valeur transmise: toutes les modifications qui remplacent l'objet entier seront perdues lors du retour de la fonction. Si vous changez simplement son contenu/état, ce changement restera pendant que vous accédez au même objet que vous avez passé (la copie locale est faite de la référence pointant vers le même objet)

Note: il pourrait ont été utilisés à des fins de démonstration, mais vous devez utiliser des génériques pour spécifier l'objet contenu dans la liste:List<String> au lieu du type List brut

2

Références en Java sont passés par valeur. Vous ne pouvez donc pas spécifier de paramètre sur. Ce que vous pouvez faire (cependant) est de muter un objet transmis. Ainsi, dans votre exemple ci-dessus, vous pouvez passer un List vide et le remplir dans votre méthode appelée.

dire dans ce qui précède:

myList.addAll(...); 

vous aurait probablement vouloir affirmer comme une condition préalable que la liste adoptée est vide.

Je dirais peut-être que ce n'est pas un modèle très courant dans le monde Java. Parce que out les paramètres n'existent pas, il n'est pas attendu de comportement que les arguments passés en tant que paramètres changeraient, et vous feriez mieux de créer un type d'objet approprié à renvoyer.

1

La variable myList est locale à cette fonction. Les références sont passées par valeur, pas par pointeur dans le monde Java. Dès que vous quittez, il est supprimé de la pile de contexte. Une option possible est de ne pas retourner un booléen mais de retourner la liste elle-même. Ensuite, vous pouvez tester la liste pour null pour voir si votre fonction a fonctionné ou non.

Une autre option consiste à créer réellement votre liste, puis de la passer à la fonction (non nulle). Ensuite, votre fonction n'a pas besoin de créer une nouvelle liste, mais simplement ajouter des valeurs.

+0

+1: * "Les références sont transmises par valeur, pas par pointeur" * – Mohayemin

0

Une courte réponse- juste retourner la nouvelle liste en tant que valeur de retour de la fonction:

List myFunction(int x, in y, List myList) { 
    ...Do things... 
    return anotherList.subList(fromIndex, toIndex); 
} 

la réponse longue est que java copier le pointeur de votre objet lorsque vous appelez une fonction, cela signifie que si vous affecter un nouvel objet à la méthode param, cela n'affecterait pas la variable d'origine. vous devez donc enregistrer la référence param si vous voulez changer la valeur de l'objet.