Question

    

Cette question a déjà une réponse ici:

         

Je rencontre souvent des méthodes qui ressemblent à ce qui suit:

public void foo(final String a, final int[] b, final Object1 c){
}

Et si cette méthode est appelée sans passer il des paramètres finaux. dire un Object1 qui est ensuite changé (donc non déclarée comme définitive) peut être passé à cette méthode très bien

Était-ce utile?

La solution

Java fait toujours une copie des paramètres avant de les envoyer à des méthodes. Cela signifie que la finale ne signifie pas de différence pour le code d'appel. Cela signifie seulement que l'intérieur ne peuvent pas être réaffectés la méthode des variables. (Notez que si vous avez un objet final, vous pouvez toujours modifier les attributs de l'objet).

Autres conseils

Il y a un cas où vous êtes requis pour déclarer finale --otherwise elle se traduira par la compilation error--, à savoir les faisant passer par en classes anonymes. Exemple simple:

public FileFilter createFileExtensionFilter(final String extension) {
    FileFilter fileFilter = new FileFilter() {
        public boolean accept(File pathname) {
            return pathname.getName().endsWith(extension);
        }
    };

    // What would happen when it's allowed to change extension here?
    // extension = "foo";

    return fileFilter;
}

Suppression du modificateur de final entraînerait une erreur de compilation, car il ne garantit plus que la valeur est une constante d'exécution. Modification de la valeur de l'extérieur de la classe anonyme serait à savoir faire l'instance de classe anonyme à se comporter différents après le moment de la création.

Java est passe par valeur uniquement. (Ou mieux - pass-référence par valeur)

Alors l'argument passé et l'argument dans la méthode sont deux différentes Chariot pointant vers le même objet (valeur).

Par conséquent, si vous changez l'état de l'objet, il est réfléchi à toutes les autres variables qui est référençant. Mais si vous réassigner un nouvel objet (valeur) à l'argument, alors d'autres variables pointant vers cet objet (valeur) ne soient pas réaffectés.

Le mot-clé final sur un paramètre de méthode ne signifie absolument rien à l'appelant. Cela signifie aussi absolument rien au programme en cours d'exécution, puisque sa présence ou de l'absence ne change pas le bytecode. Il assure seulement que le compilateur se plaindra si la variable de paramètre est réaffecté dans la méthode. C'est tout. Mais cela suffit.

Certains programmeurs (comme moi) pensent que est une très bonne chose et utiliser final sur presque tous les paramètres. Il est plus facile de comprendre une méthode longue ou complexe (si l'on peut faire valoir que devraient être refactorisés. Méthodes longues et complexes) Il brille également un coup de projecteur sur les paramètres de la méthode que ne sont pas marqué par final.

Considérez cette implémentation de foo ():

public void foo(final String a) {
    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            System.out.print(a);
        }
    }); 
}

Parce que l'instance de Runnable survivrait la méthode, ce ne serait pas compiler sans le mot-clé final - final indique au compilateur qu'il est sûr de prendre une copie de la référence (pour désigner ultérieurement). Ainsi, il est référence qui est considéré comme définitif, pas la valeur . En d'autres termes: En tant que visiteur, vous ne pouvez pas tout gâcher ...

finale signifie que vous ne pouvez pas modifier la valeur de cette variable une fois qu'il a été affecté.

Pendant ce temps, l'utilisation de finale pour les arguments de ces moyens de méthodes il ne permettra pas au programmeur de changer leur valeur lors de l'exécution de la méthode . Cela signifie seulement que l'intérieur ne peuvent pas être réaffectés la méthode des variables finale .

Si vous déclarez un paramètre comme définitif, vous ne pouvez pas changer la valeur de celui-ci.

class Bike11 {  
    int cube(final int n) {  
        n=n+2;//can't be changed as n is final  
        n*n*n;  
     }  
    public static void main(String args[]) {  
        Bike11 b=new Bike11();  
        b.cube(5);  
    }  
}   

Sortie: Erreur de compilation Time

Pour plus de détails, s'il vous plaît visitez mon blog: http://javabyroopam.blogspot.com

Les chaînes sont immuables, donc actully vous ne pouvez pas changer la chaîne après (vous ne pouvez faire la variable qui a tenu le point d'objet String à un autre objet String).

Cependant, ce n'est pas la raison pour laquelle vous pouvez lier une variable à un paramètre final. Tous les contrôles du compilateur est que le paramètre est réaffecté dans les la méthode. Ce qui est bon pour la documentation, sans doute un bon style, et peut même aider à optimiser le code octet pour la vitesse (bien que cela ne semble pas faire grand-chose dans la pratique).

Mais même si vous réassigner un paramètre dans une méthode, l'appelant ne remarque pas que, parce que Java ne tous les paramètres qui passe par la valeur. Après la séquence

  a = someObject();
  process(a);

les champs d'un peut-être changé, mais est toujours le même objet qu'il était avant. Dans les langues passe par référence cela peut ne pas être vrai.

@stuXnet, je pourrais faire l'argument exact opposé. Si vous passez un objet à une fonction, et que vous modifiez les propriétés de l'objet passé alors l'appelant de la fonction verra la valeur modifiée dans sa variable. Cela implique un laissez-passer par le système de référence, passe pas par la valeur.

Ce qui est source de confusion est la définition de passage par valeur ou passage par référence dans un système où l'utilisation de pointeurs est complètement caché à l'utilisateur final.

Java est passe certainement pas par la valeur, pour être tel, signifierait qu'on pourrait muter l'objet passé et l'original ne serait pas affectée.

Notez que vous ne pouvez pas muter primitives vous ne pouvez les assigner à des variables. Ainsi, un test Passer par référence ou par valeur à l'aide des primitives est pas un test.

Ce que vous ne pouvez pas faire en Java qui peut être fait dans d'autres langues est de réaffecter les variables de l'appelant à une nouvelle valeur, car il n'y a pas de pointeurs en Java, donc cela rend confus.

mot-clé dans le dernier paramètre d'entrée de la méthode n'est pas nécessaire. Java crée une copie de la référence à l'objet, afin de mettre final il ne fait pas l'objet final, mais uniquement la référence, ce qui n'a pas de sens

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