[Java] Différence entre "variable finale" et "objet immuable"

Domo est Fugito. Cette fois sur les variables finales et les objets immuables J'ai essayé ensemble.

variable finale

Une dernière variable est une variable pour laquelle le modificateur final est spécifié. Sa nature est appelée "immuable / lecture seule" Cependant, à proprement parler, "** variable non réattribuable **".

    final int i = 3;
 i = 5; // Erreur de compilation due à une réaffectation

Dans ce qui précède, final est spécifié pour la variable de type de base (type int) i. Pour les variables de type de base, la "valeur elle-même" est conservée dans la valeur de la variable. C'est une variable (Pour plus de détails, voir "Affectation de variable de type de base et affectation de variable de type de référence. Différences ”). Par conséquent, la «valeur elle-même» est remplacée. La réaffectation entraînera une erreur de compilation. Autrement dit, le type de base En ce qui concerne les variables, les variables finales sont "immuables" ressemble à. Ce qui est déroutant, c'est la variable de référence finale spécifiée.

    final StringBuilder sb = new StringBuilder("123");
 sb = new StringBuilder ("456"); // Erreur de compilation

    final StringBuilder sb2 = new StringBuiler("789");
 sb.append ("★"); // Aucune erreur de compilation!
 System.out.println (sb2); // "789 ★" est affiché

Dans l'exemple ci-dessus, nous manipulons les variables de référence sb et sb2. Ici, si vous comprenez que la nature de la variable finale est "immuable", L'opération sur sb entraîne une erreur et l'opération sur sb2 ne le fait pas. Je ne comprends pas la signification de. Maintenant, si vous rappelez la valeur détenue par la variable de type référence, C'était une "référence à un objet". Autrement dit, qn et sb2 a des "valeurs elles-mêmes" telles que "123" et "789" n'est pas. Ce qu'ils (?) Ont est "" 1 23 (456) «Une référence à un objet qui est dans un état». Considérez ce mécanisme et la définition stricte des variables finales «non réassignables» Si vous le mettez, vous pouvez comprendre l'exemple ci-dessus. C'est, L'opération "sb = new StringBuilder (" 456 ")" pour sb, ceci L'opération "** réaffecte-t-elle la valeur de la nouvelle référence à sb ". Yo Ensuite, en raison de la nature de la variable finale, une erreur de compilation se produit. d'autre part, Fonctionnement de "sb2.append (" ★ ")", qui a l'état "" 789 " Changer l'état de l'objet en l'état "789 ★" ** " Ce sera un travail. En bref, de "valeur de référence à objet" à sb2 Aucune réaffectation n'a eu lieu. Par conséquent, aucune erreur ne se produit.

Objet immuable

Alors que la variable finale a la propriété «non réassignable», c'est un objet immuable. Kut interdit également "de changer l'état des objets". En d'autres termes Le fonctionnement de "sb.append (" ★ ")" dans l'exemple ci-dessus n'est pas non plus possible. C'est un objet immuable.

Résumé

** - La variable finale a la propriété "non réattribuable" -Si la variable de type de référence est finalement spécifiée, "Changer la destination de référence" sera Je ne peux pas, mais "Changer l'état du premier objet référencé Peut être changé -Impossible de "changer l'état du premier objet référencé" Appelez l'objet un "objet immuable" **

... Puis cette fois par ici. C'était Fugi.

(P.S.) Si vous avez des suggestions pour le contenu de l'article N'hésitez pas à me le faire savoir m (_ _) m

Recommended Posts

[Java] Différence entre "variable finale" et "objet immuable"
Différence entre final et immuable en Java
[Java] Différence entre == et égal
[Java] Différence entre statique final et final dans les variables membres
[Java] Différence entre Hashmap et HashTable
Différence entre la variable d'instance et la variable de classe
[JAVA] Différence entre abstrait et interface
[Java] Différence entre array et ArrayList
[Java] Différence entre fermable et fermable automatiquement
[Java] Différence entre StringBuffer et StringBuilder
[Java] Différence entre longueur, longueur () et taille ()
[Java] Différence entre l’affectation d’une variable de type de base et l’affectation d’une variable de type de référence
[Pour les débutants] Différence entre Java et Kotlin
[Java] Différence entre la plage Intstream et la plageClosed
Différence entre int et Integer en Java
[Java] Comprendre la différence entre List et Set
[Java] Différence entre "variable finale" et "objet immuable"
variable
variable statique
Fonction de conversion d'objet de liste immuable (immuable) dans Java8
Différence entre vh et%
Différence entre i ++ et ++ i
À propos des setters et des getters Java. <Différence par rapport à l'orientation de l'objet>
[Java débutant] Différence entre la longueur et la longueur () ~ Je ne sais pas ~
Différence entre CUI et GUI
Différence entre les variables et les variables d'instance
Différence entre mockito-core et mockito-all
Différence entre l'installation de bundle et de bundle
Différence entre render et redirect_to
Différence entre List et ArrayList
java Generics T et? Différence
Différence entre .bashrc et .bash_profile
Différence entre StringBuilder et StringBuffer
Différence entre render et redirect_to
[Docker-compose] Différence entre env_file et environnement. À propos de la priorité de l'application de variable d'environnement
Différence entre Java et JavaScript (comment trouver la moyenne)
[Java] Vérifiez la différence entre orElse et orElseGet avec IntStream
[Java] Différence entre l'erreur de débordement de pile et l'erreur de mémoire insuffisante
L'évaluation des courts-circuits est-elle vraiment rapide? Différence entre && et & en Java
[Ruby] Différence entre obtenir et publier
Différence entre la méthode d'instance et la méthode de classe
Différence entre l'opérateur == et la méthode égale
Différences entre Java "débutant" et Kotlin
Déclaration, initialisation et types de variables Java
[Terminal] Différence entre irb et pry
JavaServlet: différence entre executeQuery et executeUpdate
[Ruby] Différence entre is_a? Et instance_of?
Différence entre l'opérateur == et la méthode eqals
Différence approximative entre RSpec et minitest
[Rails] Différence entre find et find_by
[Java] Relation entre H2DB et JDBC
Différence entre Thymeleaf @RestController et @Controller
Différence entre Stream map et flatMap
Différence entre le type primitif et le type de référence
Différence entre string.getByte () et Hex.decodeHex (string.toCharaArray ())
Différences entre Java et .NET Framework
[rails] Différence entre redirect_to et render