119 votes

Comment créer une classe immuable ?

Je travaille sur la création d’une classe immuable.
J’ai marqué toutes les propriétés en lecture seule.

J’ai une liste d’éléments dans la classe.
Bien que la liste est modifiable si la propriété est en lecture seule.

Exposer l’interface IEnumerable de la liste, il est immuable.
J’ai voulu savoir ce qui est les règles de base, il faut suivre pour qu’une classe immuable ?

Merci.

125voto

Blair Conrad Points 56195

Je pense que vous êtes sur la bonne voie

  • toutes les informations injecté dans la classe devraient être fournis par le constructeur
  • toutes les propriétés doivent être getters seulement
  • si une collection (ou un Tableau) est passé dans le constructeur, il doit être copié à garder à l'appelant de le modifier plus tard
  • si vous allez retourner votre collection, soit retourner une copie ou une version lecture seule (par exemple, à l'aide de ArrayList.ReadOnly ou similaire - vous pouvez combiner cela avec le point précédent et stocker une copie en lecture seule à être retourné lorsque les appelants d'accès), de retour d'un agent recenseur, ou utilisez une autre méthode/propriété qui permet un accès en lecture seule dans la collection
  • gardez à l'esprit que vous pouvez toujours avoir l'apparence d'un mutant de classe si l'un de vos membres sont mutables - si c'est le cas, vous devez copier loin quel que soit l'état que vous souhaitez conserver et éviter de se retrouver ensemble mutable objets, à moins que vous les copier avant de les donner à l'appelant - une autre option est de retour seulement immuable "sections" de la mutable objet grâce à @Brian Rasmussen, qui m'a encouragée à développer ce point

37voto

Jon Skeet Points 692016

Je recommande fortement que vous lisiez série blog de Eric Lippert sur l’immuabilité, en particulier l’entrée sur « types d’immuabilité ».

Votre commentaire que « exposer l’interface IEnumerable de la liste rend immuable » semble un peu étrange pour moi. Qu’entendez-vous par elle ?

20voto

Joe Points 60749

Pour être immuable, toutes vos propriétés et champs devraient être readonly. Et les éléments de toute liste eux-mêmes soient immuables.

Vous pouvez effectuer une propriété readonly de la liste comme suit :

12voto

lubos hasko Points 13669

Aussi, gardez à l’esprit que :

n’est pas immuable même si elle est marquée avec le mot clé readonly. Vous pouvez encore modifier les références/valeurs de tableau individuels par accesseur d’index.

5voto

mbillard Points 15829

Utiliser le classe. Il est situé dans le espace de noms.

Sur quoi que ce soit qui renvoie votre liste (ou dans le constructeur), définie la liste comme une collection en lecture seule.

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