Actuellement, je lis "La concurrence de Java dans la pratique", qui contient cette phrase:
Étant donné que l'action d'un thread qui accède à un objet sans état ne peut pas affecter l'exactitude des opérations sur d'autres threads, les objets sans état sont protégés contre les threads.
Alors, quel est l'objet sans état?
Un objet sans état est une instance d'une classe sans champs d'instance (variables d'instance). La classe peut possède des champs, mais ce sont des constantes au moment de la compilation (statique final).
Un terme très apparenté est immuable . Les objets immuables peuvent avoir un état, mais cela ne change pas lorsqu'une méthode est invoquée (les invocations de méthodes n'affectent pas de nouvelles valeurs aux champs). Ces objets sont également thread-safe.
Si l'objet ne comporte aucun champ d'instance, il l'est sans état. De plus, il peut être sans état s'il contient des champs, mais leurs valeurs sont connues et ne changent pas.
Ceci est un objet sans état:
class Stateless {
void test() {
System.out.println("Test!");
}
}
C'est aussi un objet sans état:
class Stateless {
//No static modifier because we're talking about the object itself
final String TEST = "Test!";
void test() {
System.out.println(TEST);
}
}
Cet objet a un état, il est donc not sans état. Cependant, son état n'est défini qu'une fois, et il ne change pas plus tard, ce type d'objets s'appelle immuable:
class Immutable {
final String testString;
Immutable(String testString) {
this.testString = testString;
}
void test() {
System.out.println(testString);
}
}
Un objet sans état, comme des variables d'instance pouvant changer et varier en fonction de ce qui est déjà arrivé à l'objet
Le concept d'objet sans état est fortement associé au concept de effets secondaires . En bref, il s’agit de l’objet qui ne contient pas de champs sous lesquels pourraient avoir des valeurs différentes, selon l’ordre des appels de méthode.
Juste une clarification . Vous pouvez considérer votre classe comme apatride comme indiqué précédemment, même si elle a une variable d'instance dans la mesure où cette variable est finale ET immuable.
Si la variable d'instance est juste finale mais modifiable, une liste de chaînes dans l'exemple, oui, la référence de la variable ne peut pas être modifiée, mais le contenu de la liste et donc l'état de la classe peuvent être modifiés.
Un objet sans état est un objet qui n'a pas d'état interne (variable interne)
En termes simples, état d'objet signifie la valeur des variables internes dans cet objet.
Stateful - l'état de l'objet peut être modifié, signifie que les valeurs internes des variables membres de cet objet peuvent être modifiées
Comment les valeurs peuvent être changées?
En définissant la valeur.
Quand pouvez-vous définir cette valeur? Quand la variable n'est pas finale ..
Donc, pour que la classe soit sans état, définissez la variable comme finale, de sorte que la valeur de cette variable ne puisse être changée ni dans setter ni dans une autre méthode. Il ne peut être utilisé que pour l'informatique.
Un objet qui n'a absolument aucun état, alors il n'y a aucun problème à les réutiliserà ce point la question est: s'ils n'ont absolument aucun état, pourquoi ne pas rendre toutes les méthodes statiques et ne jamais en créer du tout?
Si vous ne pouvez modifier aucun paramètre, valeur, etc. d'un objet, après sa création, cet objet est thread-safe.