Je n'arrive pas à comprendre où le final
Le mot clé est vraiment pratique lorsqu'il est utilisé sur des paramètres de méthode.
Si l'on exclut l'utilisation de classes anonymes, la lisibilité et la déclaration d'intention, elle me semble presque sans valeur.
Faire en sorte que certaines données restent constantes n'est pas aussi fort qu'il y paraît.
-
Si le paramètre est une primitive, il n'aura aucun effet puisque le paramètre est transmis à la méthode en tant que valeur et que sa modification n'aura aucun effet en dehors de la portée.
-
Si nous passons un paramètre par référence, alors la référence elle-même est une variable locale et si la référence est modifiée à l'intérieur de la méthode, cela n'aura aucun effet en dehors de la portée de la méthode.
Considérez l'exemple de test simple ci-dessous. Ce test passe bien que la méthode ait changé la valeur de la référence qui lui a été donnée, elle n'a aucun effet.
public void testNullify() {
Collection<Integer> c = new ArrayList<Integer>();
nullify(c);
assertNotNull(c);
final Collection<Integer> c1 = c;
assertTrue(c1.equals(c));
change(c);
assertTrue(c1.equals(c));
}
private void change(Collection<Integer> c) {
c = new ArrayList<Integer>();
}
public void nullify(Collection<?> t) {
t = null;
}
117 votes
Un petit point sur la terminologie - Java n'a pas du tout de pass-by-reference. Il a une référence de passage par valeur ce qui n'est pas la même chose. Avec une véritable sémantique de passage par référence, les résultats de votre code seraient différents.
10 votes
Quelle est la différence entre le passage par référence et le passage par valeur ?
1 votes
Il est plus facile de décrire cette différence dans un contexte C (du moins pour moi). If I pass a pointer to a method like: <code>int foo(int bar)</code>, alors ce pointeur est transmis par valeur. Cela signifie qu'il est copié, donc si je fais quelque chose à l'intérieur de cette méthode comme <code>free(bar) ; bar = malloc(...);</code> alors je viens de faire une très mauvaise chose. The free call will actually free up the chunk of memory being pointed at (so whatever pointer I passed in is now dangling). However, <code>int foo(int &bar)</bar> signifie que ce code est valide et que la valeur du pointeur transmis sera modifiée.
4 votes
Le premier est censé être
int foo(int* bar)
et le dernierint foo(int* &bar)
. Dans ce dernier cas, il s'agit de passer un pointeur par référence, alors que dans le premier cas, il s'agit de passer une référence par valeur.2 votes
@Martin, à mon avis, c'est une bonne chose. pregunta ; voir le titre comme une question, et le contenu du message comme une explication de la raison pour laquelle le pregunta est demandé. Peut-être ai-je mal compris les règles, mais c'est exactement la question que je voulais poser en cherchant "Utilisation des paramètres finaux dans les méthodes .
0 votes
Le titre est une question, mais le corps ne l'est pas. Il s'agit d'un exemple basé sur une idée fausse. Changer la référence dans un autre champ d'application (au moyen d'un appel de méthode) ne change pas la référence dans le champ d'application actuel.