Question

Toutes les classes finales en Java sont-elles immuables? String et Integer sont des classes finales et sont immuables, je crois.

Était-ce utile?

La solution

Non - une classe finale signifie que vous ne pouvez pas en hériter. Cela n'a rien à voir avec la mutabilité. La classe suivante est finale mais modifiable:

public final class FinalMutable {
  int value;
  public void setValue(int v) { value=v; }
  public int getValue() { return value; }
}

Autres conseils

Non, final signifie que la classe ne peut pas être étendue. Cela ne dit rien sur la mutabilité. Par exemple:

final class MutInt {
   public int modifyMe;
}

Il n'y a pas de mot clé pour l'immutabilité, c'est plutôt un motif de conception.

EDIT:
Cela signifie qu'il n'y a pas de mot clé qui rend une classe immuable. Pour rendre une classe immuable, vous devez protéger les internes en les rendant définitifs ou privés.

La confusion est la suivante: le mot-clé final a différentes significations s’il est utilisé dans une classe, alors qu’il est utilisé dans un champ / une variable. Le premier signifie "cette classe ne peut pas être étendue". Le second signifie "cette variable (ou cette référence) ne peut pas être modifiée".

En plus des autres réponses, si vous examinez le code de java.lang.String , vous verrez qu'il contient un champ: hash , qui est mutable et est en fait calculé et stocké lorsque hashCode () est appelé pour la première fois.

Toutefois, la classe est toujours immuable : le champ hash n'est pas accessible directement ni modifié en dehors de la classe.

De plus, vous remarquerez peut-être qu’une approche commune au sein de JDK est l’implémentation d’emballeurs immuables pouvant être utilisés pour exposer l’état interne d’un objet sans permettre sa modification; par exemple

private final List<String> values;

public List<? get String> getValues() {
  return Collections.unmodifiableList(values);
}

Comme l'ont dit les autres avant, final ne rend pas une classe imuable en Java, bien qu'elle joue un rôle dans la stratégie d'immutabilité. Pour obtenir l’immutabilité, vous devez suivre les directives générales:

  • assurez-vous que la classe ne peut pas être remplacée - indiquez la classe final , ou utilisez des fabriques statiques et gardez les constructeurs privés
  • créer des champs privé et final
  • oblige les appelants à construire un objet complètement en une seule étape, au lieu d'utiliser un constructeur sans argument associé aux appels suivants aux méthodes setXXX (c'est-à-dire, évitez la convention Java Beans)
  • ne fournit aucune méthode qui puisse changer l'état de l'objet de quelque manière que ce soit - pas seulement les méthodes setXXX , mais toute méthode pouvant changer d'état
  • si la classe a des champs d'objet mutables, ils doivent être copiés de manière défensive lorsqu'ils sont passés entre la classe et son appelant

Les méthodes substituées de la sous-classe ne permettent pas d'accéder au champ privé ... Il est donc impossible que les méthodes de la sous-classe modifient le champ privé de la super classe ... Dans quel cas est-il utile de rendre la classe immuable finale ?

Les mots-clés finaux empêchent les autres classes d’en hériter. Le mot-clé final ne le rend pas immuable, mais il existe des conditions telles que rendre les membres de la classe d'instance privés, ainsi que final, en utilisant des accesseurs (getters) et en n'utilisant pas de séparateurs

Une classe immuable finale ne peut pas être mutée. Ci-dessous, il montre une classe immuable non finale en cours de mutation:

// a class not intended to be mutated 
public class GoodClass{

   private String name;

   public GoodClass() {
       this.name = "Good Class Neme";
   }

   public String getName() {
       return name;
   }
}

public class BadClass extends GoodClass {

   private String name;

   public String getName() {
       return name;
   }

   // mutating state
   public void setName(String name) {
       this.name = name;
   }
}



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