Comment rendre une classe java immuable et quel est le besoin d'immutabilité et y a-t-il un avantage à cela?
Réponses
Trop de publicités?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.
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.
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.
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)
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.