Pourquoi aurait-on déclarer un immuable classe final en Java?

J'ai lu que pour faire un classe immuable en Java, nous devons faire le suivant,

  1. Ne pas fournir toutes les poseurs de
  2. Marque tous les champs privés
  3. Faire la classe finale

Pourquoi l'étape 3? Pourquoi devrais-je marquer la classe final?

  • java.math.BigInteger classe est de donner l'exemple, c'est les valeurs sont immuables, mais elle n'est pas définitive.
  • Si vous avez un BigInteger, vous ne savez pas si il est immuable ou pas. C'est une foiré conception. / java.io.File est un exemple plus intéressant.
  • Ne pas permettre à des sous-classes pour remplacer les méthodes - la façon La plus simple de le faire est de déclarer la classe comme final. Une approche plus sophistiquée consiste à rendre le constructeur privé et de construire des instances dans l'usine de méthodes de docs.oracle.com/javase/tutorial/essential/concurrency/...
  • pouvez-vous expliquer (ou un lien vers une explication) pourquoi java.io.File est un exemple intéressant?
  • File est intéressant parce qu'il est susceptible de faire confiance à un être immuable, et donc conduire à TOCTOU (Moment De l'enregistrement/au Moment De l'Utilisation) des attaques. Le code de confiance vérifie que le File un chemin d'accès, puis utilise le chemin d'accès. Un sous-classé File peut changer de valeur entre les vérifier et de les utiliser.
InformationsquelleAutor Anand | 2012-09-06