45 votes

Manipulation des variables finales en Java

Quelqu'un pourrait-il me dire quelle est la signification de la ligne suivante dans le contexte de Java :

variable finale peut toujours être manipulée, sauf si elle est immuable

Pour autant que je sache, en déclarant une variable comme finale, vous ne pouvez plus la modifier, alors ce qu'ils veulent dire avec le mot immuable dans la ligne ci-dessus ?

98voto

Michael Borgwardt Points 181658

Cela signifie que si votre variable finale est un type de référence (c'est-à-dire pas une primitive comme int), alors c'est seulement la référence qui ne peut pas être modifiée. Elle ne peut pas faire référence à un objet différent, mais les champs de l'objet auquel elle fait référence peuvent toujours être modifiés, si la classe le permet. Par exemple :

final StringBuffer s = new StringBuffer();

Le contenu du StringBuffer peut toujours être modifié de manière arbitraire :

s.append("something");

Mais vous ne pouvez pas dire :

s = null;

ou

s = anotherBuffer;

D'un autre côté :

final String s = "";

Les chaînes de caractères sont immuables. Il n'existe tout simplement aucune méthode permettant de modifier une chaîne de caractères (à moins que vous n'utilisiez Reflection - et allez en enfer).

16voto

Savvas Dalkitsis Points 5865

Si vous avez une référence finale à un objet Java, vous pouvez toujours le manipuler mais vous ne pouvez pas modifier sa référence. Par exemple, ce code est parfaitement légal :

import javax.swing.JLabel;

class Test1 {
    private final static JLabel l = new JLabel("Old text");
    public static void main(String[] args) {
        System.err.println(l.getText());
        l.setText("New Text");
        System.err.println(l.getText());
    }
}

Mais vous ne pouvez pas dire :

l = new JLabel("Newest Text");

Après la première affectation à l. Notez que vous pouvez cependant le faire :

import javax.swing.JLabel;

class Test1 {
    public static void main(String[] args) {
        final JLabel l;
        String s = getArbitaryString(); // Assume this method returns a string
        l = new JLabel(s);
        System.err.println(l.getText());
    }
}

Cela peut être fait parce que lorsque l est déclaré, il n'est pas assigné à quoi que ce soit, même pas à null. Vous n'êtes donc autorisé à lui attribuer quelque chose qu'une seule fois.

Il en va de même pour les primitives. Vous pouvez leur attribuer une valeur comme ceci :

class Test1 {
    public static void main(String[] args) {
        final int i;
        i = 2;
    }
}

Mais maintenant, vous ne pouvez plus le manipuler puisque la seule chose que vous pouvez faire avec les types primitifs est de leur attribuer des valeurs.

4voto

Fred Points 31

Vous ne pouvez pas changer l'objet ou la valeur à laquelle une variable finale fait référence. Vous ne pouvez affecter une variable finale qu'une seule fois.

Cela n'a aucun effet sur la possibilité de modifier l'état de l'objet. L'objet lui-même peut toujours être manipulé, à moins qu'il ne soit codé de manière à ce que cette manipulation soit interdite. Un objet immuable est un objet dont l'état ne peut pas changer.

3voto

pgb Points 17316

Comme d'autres l'ont dit, cela signifie que vous pouvez manipuler l'objet sur lequel pointe la variable, mais que vous ne pouvez pas modifier la référence (c'est-à-dire assigner un autre objet à la variable).

Les objets qui sont mutables par conception, tels qu'une List peuvent être modifiés (vous pouvez y ajouter des éléments) alors que si vous avez un objet immuable tel qu'une String ou Integer vous ne pourrez pas le modifier (toutes les opérations que la classe String renvoient une nouvelle instance, et ne modifient pas l'objet actuel).

0voto

fastcodejava Points 22174

Vous pouvez appeler n'importe quelle méthode sur cette référence, même si cette méthode peut changer l'état de l'objet que la référence pointe. Par exemple

final MyClass myClass = new MyClass();
myClass.setVar(something);

C'est bien parce que myClass elle-même ne change pas, c'est-à-dire que vous ne faites pas myClass = myClass1; .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X