Question

  

Possible en double:    Java est-il « passe par référence »?

J'ai trouvé une méthode Java inhabituelle aujourd'hui:

private void addShortenedName(ArrayList<String> voiceSetList, String vsName)
{
     if (null == vsName)
       vsName = "";
     else
       vsName = vsName.trim();
     String shortenedVoiceSetName = vsName.substring(0, Math.min(8, vsName.length()));
     //SCR10638 - Prevent export of empty rows.
     if (shortenedVoiceSetName.length() > 0)
     {
       if (!voiceSetList.contains("#" + shortenedVoiceSetName))
         voiceSetList.add("#" + shortenedVoiceSetName);
     }
}

D'après tout ce que j'ai lu sur le comportement de Java pour les variables passant, des objets complexes ou non, ce code ne doit rien faire exactement. Donc, euh ... suis-je manque quelque chose ici? Y at-il une certaine subtilité qui a été perdu sur moi, ou ce code appartient à thedailywtf?

Était-ce utile?

La solution

Comme dit Rytmis, Java passe par des références de valeur. Ce que cela signifie est que vous pouvez appeler légitimement sur les méthodes muter paramètres d'une méthode, mais vous ne pouvez pas réattribuer les et attendez la valeur à se propager.

Exemple:

private void goodChangeDog(Dog dog) {
    dog.setColor(Color.BLACK); // works as expected!
}
private void badChangeDog(Dog dog) {
    dog = new StBernard(); // compiles, but has no effect outside the method
}

Modifier Ce que cela signifie dans ce cas est que, bien que voiceSetList peut changement à la suite de cette méthode (il pourrait avoir un nouvel élément ajouté à lui), le les changements à vsName ne seront pas visibles en dehors de la méthode. Pour éviter toute confusion, je marque souvent mes paramètres de la méthode final, ce qui les empêche d'être réaffecté (accidentellement ou non) à l'intérieur de la méthode. Cela maintiendrait le deuxième exemple de la compilation du tout.

Autres conseils

Java passe références de valeur , vous obtenez une copie de la référence, mais l'objet référencé est le même. Par conséquent ce procédé ne modifie la liste des entrées.

Les références elles-mêmes sont passés par valeur.

De Java Comment programmer, 4e édition par Deitel et Deitel: (. Pg 329)

  

Contrairement à d'autres langues, Java ne permet pas au programmeur de choisir si vous voulez passer   chaque argument par valeur ou par référence. variables de type de données primitives sont toujours passés   par valeur. Les objets ne sont pas passés aux méthodes; sont passés plutôt des références aux objets   méthodes. Les références sont eux-mêmes passés par valeur-copie d'une référence est passée   un procédé. Quand un procédé reçoit une référence à un objet, le procédé peut manipuler   l'objet directement.

utilisé ce livre lors de l'apprentissage Java au collège. référence brillante.

Voici un bon article expliquant. http://www.javaworld.com/javaworld /javaqa/2000-05/03-qa-0526-pass.html

Eh bien, il peut manipuler le ArrayList - qui est un objet ... si vous passez une référence d'objet autour (même passé par valeur), des modifications à cet objet sera reflété à l'appelant. Est-ce la question?

Je pense que vous êtes confus parce que vsNom est modifié. Mais dans ce contexte, il est juste une variable locale, exactement au même niveau que shortenedVoiceSetName.

Il est pas clair pour moi que la question exacte dans le code est. Java est passe par valeur, mais les tableaux sont passer par référence car ils passent pas un objet mais seulement des pointeurs! Les tableaux se composent de pointeurs, pas des objets réels. Cela les rend très rapide, mais rend aussi dangereux à manipuler. Pour résoudre ce problème, vous devez les cloner pour obtenir une copie, et même alors il ne cloner la première dimension du tableau.

Pour plus de détails, voir ma réponse ici: En Java, ce qui est une copie superficielle? (voir aussi mes autres réponses)

Par ailleurs, il y a des avantages sous forme de tableaux ne sont que des pointeurs: vous pouvez (ab) les utiliser comme des objets synchronisés

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top