Doit toutes les propriétés d'un objet immuable finale?
Doit des objets immuables ont toutes les propriétés de l'être final
?
Selon moi pas. Mais je ne sais pas, si je suis de droite.
- Bien final tout à fait de sorte que vous ne pouvez pas réaffecter le domaine.. l'objet référencé par un champ final pourrait être mutable
Vous devez vous connecter pour publier un commentaire.
La principale différence entre un objet immuable (toutes les propriétés finales) et, effectivement, une immuable objet (propriétés ne sont pas définitives, mais ne peut pas être changé) est sûr de publication.
Vous pouvez publier une immuable objet dans un contexte multithread sans avoir à vous soucier de l'ajout de la synchronisation, grâce à la les garanties offertes par la Java de la Mémoire de Modèle pour la finale champs:
Comme une note de côté, il permet aussi d'appliquer l'immutabilité (si vous essayez de muter ces champs dans une future version de votre classe parce que vous avez oublié, il devrait être immuable, il ne compile pas).
Précisions
final List
, aucune mutation de l'exploitation (ajouter, supprimer,...) doit être fait après la construction) et (ii) vous ne laissez pasthis
échapper lors de la constructionExemple de dangereux publication:
Ce programme pourrait, en théorie, d'impression
What???
. Sii
étaient final, ce ne serait pas un résultat juridique.Vous pouvez facilement garantir l'immuabilité par encapsulation, de sorte qu'il n'est pas nécessaire:
Cependant, vous doit garantie par encapsulation dans certains cas, il n'est donc pas suffisant:
Ce n'est pas une mauvaise idée de le faire pour attraper quelques erreurs triviales, et de démontrer votre intention clairement, mais "tous les champs sont définitives" et "la classe est immuable" ne sont pas des états équivalents.
changing state
.bar
en tout cas légitimement, de sorte Foo déclarée est immuable, et j'ai une sensation apparaît donc à tous les clients d'un tel objet par le biais de l'interface exposée par Foo.Immuable = non modifiables. Afin d'apporter des propriétés final est une bonne idée. Si pas toutes les propriétés d'un objet sont protégés d'être changé, je ne dirais pas que l'objet est immuable.
MAIS d'un objet est aussi immuable que si elle ne fournit pas toutes les setters pour les propriétés privées.
Immuable objets ne DOIVENT pas être modifiés après leur création. finale de cours aide à obtenir. - Vous garantir qu'ils ne seront pas jamais être changé. MAIS que si vous disposez d'un tableau à l'intérieur de votre objet, qui est définitive? Bien sûr, la référence n'est pas changable, mais les éléments sont. Regardez ici, presque à la même question, j'ai donné aussi:
Lien
Le simple fait de déclarer un objet comme
final
ne fait pas de soi immuable. Prenez l'exemple de ce classe:Pas.
Voir, par exemple, la mise en œuvre de
java.lang.String
. Les chaînes sont immuables en Java, mais le champhash
n'est pas final (il est paresseusement calculée la première foishashCode
est appelé, puis mis en cache). Mais cela fonctionne carhash
ne peut prendre qu'une valeur par défaut qui est le même à chaque fois qu'il est calculé.Classe String est Immuable, mais bien de hachage n'est pas définitive
Et bien c'est possible, mais avec quelques règles ou des restrictions et qui est de l'accès à mutable propriétés/champs doivent fournir le même résultat à chaque fois que nous avons accès à elle.
Classe String hashcode effectivement calculés sur le dernier tableau de caractères qui ne va pas changer si la Chaîne a construit. Donc immuable classe peut contenir des champs mutables/propriétés, mais il doit s'assurer que l'accès à terrain/propriété produira le même résultat à chaque fois qu'il est accessible.
Pour répondre à votre question, il n'est pas obligatoire d'avoir tous les champs de finale dans un immuable classe.
Pour en savoir plus rendez-vous ici [blog] : http://javaunturnedtopics.blogspot.in/2016/07/string-is-immutable-and-property-hash.html
Pas nécessaire, vous pouvez obtenir la même fonctionnalité en faisant de membre à titre non-définitif, mais privé et de ne pas les modifier, sauf dans le constructeur. Ne pas fournir de la méthode de définition pour eux et si c'est un objet mutable, il n'y a pas de fuite de référence pour ce membre.
Rappelle avoir fait une variable de référence finale, assure qu'il ne sera pas réattribué une valeur différente, mais vous pouvez toujours modifier les propriétés d'un objet pointé par la variable de référence. C'est l'un des points clés.