web-dev-qa-db-fra.com

Pouvons-nous changer la valeur d'une variable finale d'une classe mutable?

Voici un code où j'ai essayé de changer la valeur d'une variable finale. Il imprime d'abord "a" puis "ab". Donc, si nous pouvons changer la valeur d'une variable finale, quel est l'avantage de déclarer une variable finale? Quelle est alors l'utilité du mot clé final? S'il vous plaît, n'importe qui peut m'aider avec ça ?????

package test_new;
public class FinalVarValueChange {
    public static void main(String[] args){
       final StringBuffer s=new StringBuffer("a");
       System.out.println("s before appending  :"+s);
       s.append("b");
      System.out.println("s after appending  :"+s);     
   }
}
11
Eagle

final n'applique aucun degré de constance de l'objet auquel se réfère une référence (c'est pas identique à const en C++).

Lorsque vous marquez une variable comme final, cela signifie que vous ne pouvez pas affecter une référence d'objet différente à cette variable.

Par exemple, ce code ne compilera pas:

final StringBuffer s=new StringBuffer("a");
s = new StringBuffer("another a"); /*not possible to reassign to s*/

Il peut être utile lors de l'utilisation de Runnables, Callables et des idiomes de verrouillage.

21
Bathsheba

StringBuffer est modifiable selon sa conception, et la méthode append est juste une méthode pour changer son contenu.

Que signifie la variable finale dans Java est:

  • Pour objet, cela signifie que vous ne pouvez pas affecter un autre objet à cette référence, mais cela ne vous empêche pas d'appeler les méthodes de cet objet.

  • Pour les variables de type de base (int, float, boolean, etc.), car il n'y a pas de référence et de pointeur et de méthode d'objet ici, donc cela signifie simplement que vous ne pouvez pas changer la valeur de la variable.

Prenez les codes suivants

final ObjectA objA = new ObjectA();

Vous pouvez bien sûr invoquer des méthodes de cet objet comme ci-dessous

objA.setXXX() //legal for a final variable objA

L'effet secondaire de la méthode setXXX () n'est pas contrôlé par le mot clé final ici.

Mais pour le code suivant

final int a = 123;

Vous ne pourrez pas attribuer de nouvelle valeur à cette variable comme ci-dessous

a = 234; //Not legal if a has been defined as a final int variable.

Mais si vous le définissez en utilisant Integer comme ci-dessous

final Integer a = new Integer(123);

Vous pourrez invoquer des méthodes d'objet a comme ci-dessous

a.xxx()

La définition finale générale est différente pour l'objet et la variable de base.

6
Lawrence Liu

final modificateur signifie que vous ne pouvez pas changer de variable, c'est-à-dire la référence à votre objet, c'est-à-dire affecter une autre valeur à la même variable. Vous pouvez cependant changer l'état de l'objet lui-même.

3
AlexR

variable finale/référence signifie que vous ne pouvez pas réaffecter une autre valeur à cette référence, mais vous pouvez changer l'état de l'objet.

Ici, vous modifiez l'état interne de StringBuffer objet s

1

Le mot clé final garantit que le reference, détenu par la variable, ne changera pas. Le state de l'instance référencée peut changer. Ce que vous recherchez probablement est immutability de l'instance référencée. C'est la responsabilité de l'instance.

1
Harmlezz

Le "final" fait référence à la variable sb qui est une référence à un StringBuffer. Parce que c'est définitif, vous ne pouvez pas faire en sorte que sb fasse référence à un autre StringBuffer. Vous pouvez cependant (comme vous l'avez trouvé) modifier l'objet StringBuffer auquel se réfère actuellement sb. Essayez de compiler ce code

final StringBuffer sb = new StringBuffer();  
sb.append("abc");  
sb.append("xyz");  
sb = new StringBuffer();  
1
Shriram