Qu'est-ce Qu'un objet sans état en Java?
Actuellement, je lis "Java concurrency in practice", qui contient cette phrase:
Étant donné que l'action d'un thread accédant à un objet sans état ne peut pas affecter l'exactitude des opérations sur d'autres threads, les objets sans état sont sûrs pour les threads.
Alors, qu'est-ce qu'un objet sans état?
8 réponses
Objet sans état est une instance d'une classe sans champs d'instance (variables d'instance). La classe Peut avoir des champs, mais ce sont des constantes de compilation (finale statique).
Un terme très lié est immuable . Les objets immuables peuvent avoir un État, mais il ne change pas lorsqu'une méthode est invoquée (les invocations de méthode n'attribuent pas de nouvelles valeurs aux champs). Ces objets sont également thread-safe.
Si l'objet ne possède pas de champs d'instance, il apatrides. En outre, il peut être sans état s'il a des champs, mais leurs valeurs sont connues et ne changent pas.
C'est un objet sans état:
class Stateless {
void test() {
System.out.println("Test!");
}
}
C'est aussi un apatrides objet:
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, donc il estPas sans état. Cependant, il n'a son état défini qu'une seule fois, et il ne change pas plus tard, ce type d'objets est appelé immuable :
class Immutable {
final String testString;
Immutable(String testString) {
this.testString = testString;
}
void test() {
System.out.println(testString);
}
}
Un objet sans état, comme les variables d'instance qui peuvent changer et varier en fonction de ce qui est déjà arrivé à l'objet
Le concept d'objet sans état est fortement couplé avec le concept d'effets secondaires . Bref, c'est l'objet qui n'a pas de champs en dessous qui pourraient avoir des valeurs différentes, en fonction de l'ordre différent des appels de méthode.
Un objet sans état est un objet qui n'a pas d'état interne (variable interne)
Juste une clarification. Vous pouvez considérer votre classe comme sans état de la manière indiquée précédemment, même lorsqu'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 mutable, 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 qui n'a absolument aucun État alors il n'y a pas de problème avec leur réutilisation à ce stade, la question Est la suivante: si elles n'ont absolument aucun état, pourquoi ne pas rendre toutes les méthodes statiques et ne jamais en créer une?
Si vous ne pouvez pas modifier un paramètre ou une valeur, etc. d'un objet, après sa création, cet objet est thread-safe.