Was ist ein zustandsloses Objekt in Java?

Lesezeit: 4 Minuten

Benutzer-Avatar
TU_HEO DAKAI

Derzeit lese ich “Java Concurrency in Practice”, das diesen Satz enthält:

Da die Aktion eines Threads, der auf ein zustandsloses Objekt zugreift, die Korrektheit von Operationen auf anderen Threads nicht beeinflussen kann, sind zustandslose Objekte Thread-sicher.

Also, was ist ein zustandsloses Objekt?

Benutzer-Avatar
Bozo

Zustandsloses Objekt ist eine Instanz einer Klasse ohne Instanzfelder (Instanzvariablen). Die Klasse kann haben Felder, aber sie sind Kompilierzeitkonstanten (statisches Finale).

Ein sehr verwandter Begriff ist unveränderlich. Unveränderliche Objekte können einen Status haben, dieser ändert sich jedoch nicht, wenn eine Methode aufgerufen wird (Methodenaufrufe weisen Feldern keine neuen Werte zu). Diese Objekte sind außerdem Thread-sicher.

  • Wenn ein Objekt ein Feld hat (nicht statisch), hat es einen Zustand. Wenn es unveränderlich ist, hat es genau einen Zustand, ist aber nicht zustandslos.

    – Assylias

    16. März 2012 um 10:41 Uhr


  • Die Antwort von @om-nom-nom ist sehr tiefgründig.

    – Benutzer2351818

    9. Mai 2016 um 10:17 Uhr

  • @Bozho Warum postest du kein Beispiel und gibst nur eine kurze Erklärung?

    Benutzer19254373

    1. Juli um 6:46

  • @OM Nom Nom ‘s Antwort ist viel besser ja.

    Benutzer19254373

    1. Juli um 6:47


  • @Bozho Chico? Irgendeine Antwort bitte?

    Benutzer19254373

    1. Juli um 8:49 Uhr

Benutzer-Avatar
Malcolm

Wenn das Objekt keine Instanzfelder hat, ist es es staatenlos. Es kann auch zustandslos sein, wenn es einige Felder hat, deren Werte jedoch bekannt sind und sich nicht ändern.

Das ist ein staatenlos Objekt:

class Stateless {
    void test() {
        System.out.println("Test!");
    }
}

Dies ist auch ein staatenlos Objekt:

class Stateless {
    //No static modifier because we're talking about the object itself
    final String TEST = "Test!";

    void test() {
        System.out.println(TEST);
    }
}

Dieses Objekt hat einen Zustand, also ist es nicht staatenlos. Der Zustand wird jedoch nur einmal festgelegt und ändert sich später nicht. Diese Art von Objekten wird aufgerufen unveränderlich:

class Immutable {
    final String testString;

    Immutable(String testString) {
        this.testString = testString;
    }

    void test() {
        System.out.println(testString);
    }
}

  • “Es hat einige Felder, aber es ist bekannt, dass sie sich nie ändern.” Das wäre unveränderlich, nicht staatenlos

    – Assylias

    16. März 2012 um 10:34 Uhr

  • @assylias Nicht unbedingt. Wenn diese Felder Konstanten sind und sie zur Kompilierzeit festgelegt werden, kennen wir immer ihre Werte. Dies bedeutet effektiv, dass das Objekt keine Zustandsinformationen trägt.

    – Malcolm

    16. März 2012 um 10:37 Uhr


  • Zustandslose Objekte haben keinen Zustand. Unveränderliche Objekte mit Feldern können nicht in einen anderen Zustand wechseln als den, in dem sie erstellt wurden, also haben sie genau einen Zustand.

    – Assylias

    16. März 2012 um 10:40 Uhr

  • @assylias Ja, aber ich spreche von den Objekten, deren Zustand bekannt ist Vor ihre Schöpfung. Nicht diejenigen, die nur einmal einen Zustand haben.

    – Malcolm

    16. März 2012 um 10:42 Uhr

  • Wenn Sie schon dabei sind, könnten Sie auch ein Beispiel für ein zustandsbehaftetes Objekt geben, aber eine schöne Erklärung.

    – Volkan Güven

    5. April 2018 um 13:44 Uhr

Benutzer-Avatar
OM Nom Nom

Das Konzept des zustandslosen Objekts ist stark mit dem Konzept der Nebeneffekte gekoppelt. Kurz gesagt, das ist das Objekt, das keine Felder darunter hat, die je nach Reihenfolge der Methodenaufrufe unterschiedliche Werte haben könnten.

  • Gute Antwort, abgestimmt. Aber könnten Sie bitte einen Beispielcode posten, um es besser zu erklären?

    Benutzer19254373

    1. Juli um 6:48

Einfach ausgedrückt bedeutet der Zustand des Objekts den Wert der internen Variablen in diesem Objekt.

Zustandsbehaftet – Zustand des Objekts kann geändert werden, bedeutet, dass interne Werte von Mitgliedsvariablen dieses Objekts geändert werden können

Wie können Werte geändert werden?

Durch Setzen des Wertes.

Wann können Sie diesen Wert festlegen? Wenn die Variable nicht final ist..

Um also die Klasse zustandslos zu machen, machen Sie die Variable final, sodass der Wert dieser Variablen weder in Setter noch in einer anderen Methode geändert werden kann. Es kann nur zum Rechnen verwendet werden.

Ein Objekt ohne Zustand, wie Instanzvariablen, die sich ändern und variieren können, je nachdem, was bereits mit dem Objekt passiert ist

Benutzer-Avatar
Marco Mondini

Ein zustandsloses Objekt ist ein Objekt, das keinen internen Zustand (interne Variable) hat.

Benutzer-Avatar
gasgas

Nur eine Klarstellung. Sie können Ihre Klasse auf die zuvor angegebene Weise als zustandslos betrachten, selbst wenn sie eine Instanzvariable hat, sofern diese Variable final UND unveränderlich ist.

Wenn die Instanzvariable nur final, aber änderbar ist, beispielsweise eine Liste von Strings, kann die Referenz der Variablen zwar nicht geändert werden, aber der Inhalt der Liste und damit der Zustand der Klasse können geändert werden.

1225710cookie-checkWas ist ein zustandsloses Objekt in Java?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy