Question

Je cherche un moyen efficace de construire une classe immuable, tout comme la classe String de Java.

Était-ce utile?

La solution

  1. Tous les champs doivent être private et de préférence final
  2. Assurez-vous que la classe ne peut pas être remplacé - rendre la classe finale, ou utiliser des usines statiques et garder constructeurs privés
  3. Les champs doivent être renseignés à partir du Constructeur / Usine
  4. Ne fournissez pas de réglages pour le champs
  5. Méfiez-vous des collections. Utilisation Collections.unmodifiable * . De plus, les collections ne doivent contenir que des objets immuables
  6. Tous les getters doivent fournir des objets immuables ou utilisez la copie défensive
  7. Ne fournissez aucune méthode qui changer l'état interne du Objet.

Tom Hawtin a souligné que final peut être facultatif. String class a un cache hash qui n'est affecté que lorsque la fonction de hachage est appelée.

Autres conseils

Si vous remplissez tous les champs à l'aide du constructeur et rendez les champs définitifs, vous y êtes en partie.

Si les champs utilisent des types personnalisés, vous devrez peut-être également les rendre immuables.

Tous les champs qui sont des collections doivent utiliser les collections non modifiables - pour plus de sécurité.

Vous devez vous soucier du graphe d'objet!

Toutes les méthodes sur l'objet doivent prendre en compte les champs non finaux. Par exemple. String.add crée une nouvelle chaîne. Si vous devez muter un champ, faites-le via un constructeur de copie.

Enfin, définissez l'objet final.

Un objet est immuable si aucun de ses champs ne peut être modifié. Ces champs doivent donc être final . Si vous ne voulez pas que votre objet soit sous-classé, vous pouvez également rendre la classe elle-même final , tout comme String. Pour construire facilement un objet immuable contenant de nombreuses informations, vous devez consulter le Modèle d'usine

Pour plus d'informations, voir Wikipedia

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