93 votes

Classe immuable?

Comment rendre une classe java immuable et quel est le besoin d'immutabilité et y a-t-il un avantage à cela?

144voto

coobird Points 70356

Qu'est ce qu'un objet immuable?

Est immuable de l'objet en est un qui ne changera pas d'état après il est instancié.

Comment faire un objet immuable?

En général, immuable objet peut être faite par la définition d'une classe qui n'a aucun de ses membres exposés, et n'a pas de définition.

La classe suivante va créer un objet immuable:

class ImmutableInt {
  private final int value;

  public ImmutableInt(int i) {
    value = i;
  }

  public int getValue() {
    return value;
  }
}

Comme on peut le voir dans l'exemple ci-dessus, la valeur de l' ImmutableInt ne peut être réglé que lorsque l'objet est instancié, et en ayant seulement un getter (getValue) l'état de l'objet ne peut pas être modifié après l'instanciation.

Toutefois, il faut veiller à ce que tous les objets référencés par l'objet doit être immuable, ou il pourrait être possible de changer l'état de l'objet.

Par exemple, en permettant une référence à un tableau ou d' ArrayList être obtenu au moyen d'un getter permettra à l'état interne de changement en modifiant le tableau ou d'une collection:

class NotQuiteImmutableList<T> {
  private final List<T> list;

  public NotQuiteImmutableList(List<T> list) {
    // creates a new ArrayList and keeps a reference to it.
    this.list = new ArrayList(list); 
  }

  public List<T> getList() {
    return list;
  }
}

Le problème avec le code ci-dessus est, que l' ArrayList peut être obtenu par getList et être manipulés, conduisant à l'état de l'objet lui-même d'être modifié, par conséquent, pas immuable.

// notQuiteImmutableList contains "a", "b", "c"
List<String> notQuiteImmutableList= new NotQuiteImmutableList(Arrays.asList("a", "b", "c"));

// now the list contains "a", "b", "c", "d" -- this list is mutable.
notQuiteImmutableList.getList().add("d");

Un moyen de contourner ce problème est de retourner une copie d'un tableau ou d'une collection, lorsqu'il est appelé à partir d'une lecture:

public List<T> getList() {
  // return a copy of the list so the internal state cannot be altered
  return new ArrayList(list);
}

Quel est l'avantage de l'immuabilité?

L'avantage de l'immuabilité est livré avec la concurrence. Il est difficile de maintenir l'exactitude dans mutable objets, comme plusieurs threads peuvent être d'essayer de changer l'état d'un même objet, conduisant à des threads de voir un autre état de l'objet même, selon le moment de la lit et écrit sur le dit objet.

En ayant un objet immuable, on peut s'assurer que tous les threads qui sont à la recherche à l'objet sera de voir le même état, comme l'état d'un objet immuable, rien ne changera.

19voto

Fabian Steeg Points 24261

En plus des réponses déjà données, je vous recommande de vous renseigner sur l’immuabilité dans Effective Java, 2e édition, car certains détails sont faciles à manquer (par exemple, des copies défensives). De plus, Effective Java 2nd Ed. est une lecture incontournable pour tous les développeurs Java.

7voto

duffymo Points 188155

Vous faites une classe immuable comme ceci:

 public final class Immutable
{
    private final String name;

    public Immutable(String name) 
    {
        this.name = name;
    }

    public String getName() { return this.name; } 

    // No setter;
}
 

Les classes immuables sont utiles car elles sont thread-safe. Ils expriment également quelque chose de profond dans votre conception: "Vous ne pouvez pas changer cela." Quand cela s'applique, c'est exactement ce dont vous avez besoin.

5voto

Jack Points 61503

L'immutabilité peut être réalisé principalement de deux façons:

  • à l'aide de final exemple attributs pour éviter de réaffectation
  • à l'aide d'une interface de classe qui n'a tout simplement pas permettre à toute opération qui est en mesure de modifier ce qui est à l'intérieur de votre classe (juste getters et pas de poseurs

Avantages de l'immuabilité sont les hypothèses que vous pouvez faire sur ces objets:

  • vous gagnez le pas de côté l'effet de la règle (qui est très populaire sur les langages de programmation fonctionnelle) et vous permet d'utiliser des objets dans un tel environnement de plus facile, puisque vous savez qu'ils ne peuvent pas être modifiées dans un atomiques ou non atomique lorsqu'ils sont utilisés par de nombreux threads
  • les implémentations de langues peut traiter ces objets d'une manière différente, en les plaçant dans des zones de mémoire qui sont utilisés pour les données statiques, permettant plus rapide et plus sûre l'utilisation de ces objets (c'est ce qui se passe à l'intérieur de la JVM pour les chaînes)

3voto

Kandy Points 33

Immuable classes ne peut pas réaffecter les valeurs après il est instancié.

pour être immuable.

  • Al les variables doivent être privé.
  • Pas de mutateur méthodes(définition) sont fournis.
  • Éviter la redéfinition de méthode en faisant de la classe finale(Forte Immuabilité) ou les méthodes final(Semaine de l'immuabilité).
  • Clone profondément si elle contient non primitive ou mutable classes.

/**
* Strong immutability - by making class final
*/
public final class TestImmutablity {

// make the variables private
private String Name;

//assign value when the object created
public TestImmutablity(String name) {
this.Name = name;
}

//provide getters to access values
public String getName() {

return this.Name;
}
}

Advanteges: Des objets immuables contient son initialisés à des valeurs jusqu'à ce qu'il meurt.

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