Question

Quelqu'un pourrait-il s'il vous plaît me dire quel est le sens de la ligne suivante dans le contexte de Java:

  

dernière variable peut encore être   manipulé sauf si elle est immuable

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

Était-ce utile?

La solution

Cela signifie que si votre dernière variable est un type de référence (à savoir pas une primitive comme int), il est seulement la référence qui ne peut pas être changé. Il ne peut pas être fait de se référer à un objet différent, mais les champs de l'objet, il se réfère à peut encore être changé, si la classe le permet. Par exemple:

final StringBuffer s = new StringBuffer();

Le contenu du StringBuffer peut encore être modifié de façon arbitraire:

s.append("something");

Mais vous ne pouvez pas dire:

s = null;

ou

s = anotherBuffer;

Par contre:

final String s = "";

Les chaînes sont immuables - il est tout simplement pas une méthode qui vous permettra de changer une chaîne (sauf si vous utilisez la réflexion - et allez en enfer).

Autres conseils

Si vous avez une référence finale à un objet Java, vous pouvez toujours le manipuler mais ne peut pas changer de 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 le faire si:

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 quand l est déclaré qu'il n'est attribué à quoi que ce soit même pas nulle. Donc, vous êtes autorisé à attribuer quelque chose à lui une seule fois.

Même chose pour les primitives. Vous pouvez attribuer une valeur à comme ceci:

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

Mais maintenant, vous ne pouvez pas le manipuler plus loin puisque la seule chose que vous pouvez faire pour les types primitifs est d'attribuer des valeurs.

Vous ne pouvez pas changer quel objet ou de la valeur d'une variable finale fait référence. Vous ne pouvez affecter une variable finale une fois.

Cela n'a aucun effet si vous pouvez changer l'état de l'objet. L'objet lui-même peut encore être manipulé à moins qu'il est codé de telle sorte que cette manipulation est interdite. Un objet immuable est un objet dont l'état ne peut pas changer.

Comme d'autres l'ont dit, cela signifie que vous pouvez manipuler l'objet des points variables à, mais vous ne pouvez pas modifier la référence (à savoir attribuer un autre objet à la variable).

Les objets qui sont mutable par la conception, comme un List peuvent être modifiés (vous pouvez ajouter des éléments à eux) alors que si vous avez un objet immuable comme un String ou Integer vous ne serez pas en mesure de le changer (tous les les opérations de la String classe prend en charge le retour d'une nouvelle instance, et ne modifient pas l'objet réel).

Celui qui me tue toujours?

Si vous voulez des variables finales soient réellement aussi sûr que vous pensiez qu'ils étaient, il faut beaucoup de code supplémentaire pour retourner une copie d'un String [].

Vous pouvez appeler une méthode sur elle, même si la méthode peut changer l'état de l'objet la référence pointe. Par exemple

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

Ceci est bien parce que myClass lui-même ne change pas, i.e. vous ne faites pas myClass = myClass1;.

Vous pouvez manipuler des variables finales mutables par exemple de type StringBuffer mais vous ne pouvez pas manipuler des variables finales de types immuables.

Dans le cas des variables mutables, nouvel objet n'est pas créé à chaque fois que sa valeur est modifiée. Mais en cas de types immuables, chaque fois que vous changez la valeur, nouvel objet est créé, donc quand vous le faites finale, vous ne pouvez pas le modifier.

Oui peut être modifié la dernière variable.

    final StringBuffer s = new StringBuffer();
    // won't work
    s = new StringBuffer();
    //this works
    s.append("hai");

Vous ne pouvez pas modifier la référence, mais les champs de l'objet peut être modifié. pour plus de détails

Vous pouvez toujours modifier une variable 'finale' en utilisant la réflexion.

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