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?

46
demandé sur gvlasov 2012-03-16 14:29:05

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.

70
répondu Bozho 2012-03-16 10:47:12

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);
    }
}
49
répondu Malcolm 2012-03-16 10:48:12

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

2
répondu Tom 2012-03-16 10:31:03

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.

2
répondu om-nom-nom 2017-05-23 10:31:22

Un objet sans état est un objet qui n'a pas d'état interne (variable interne)

1
répondu Marco Mondini 2012-03-16 10:31:26

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.

1
répondu gazgas 2013-03-03 22:06:38

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?

0
répondu Massimiliano Peluso 2012-03-16 10:31:53

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.

0
répondu Harjit Singh 2017-06-24 10:01:50