web-dev-qa-db-de.com

Letzte Variablenbearbeitung in Java

Könnte mir bitte jemand sagen, was die Bedeutung der folgenden Zeile im Zusammenhang mit Java bedeutet:

die letzte Variable kann immer noch .__ sein. manipuliert, es sei denn, es ist unveränderlich

Wenn ich weiß, dass Sie eine Variable als final deklarieren können, können Sie sie nicht erneut ändern. Was bedeuten sie dann mit dem Wort unveränderlich in der oberen Zeile?

45
Dusk

Wenn Ihre letzte Variable ein Referenztyp ist (d. H. Kein Grundelement wie int), bedeutet dies, dass nur die Referenz nicht geändert werden kann. Sie können nicht auf ein anderes Objekt verweisen, aber die Felder des Objekts, auf das es verweist, können noch geändert werden, wenn die Klasse dies zulässt. Zum Beispiel:

final StringBuffer s = new StringBuffer();

Der Inhalt des StringBuffer kann weiterhin beliebig geändert werden:

s.append("something");

Aber du kannst nicht sagen:

s = null;

oder

s = anotherBuffer;

Auf der anderen Seite:

final String s = "";

Strings sind unveränderlich - es gibt einfach keine Methode, mit der Sie einen String ändern können (es sei denn, Sie verwenden Reflection - und gehen zur Hölle).

98

Wenn Sie einen endgültigen Verweis auf ein Java-Objekt haben, können Sie es zwar bearbeiten, jedoch nicht dessen Verweis ändern. Zum Beispiel ist dieser Code absolut legal:

import javax.swing.JLabel;

class Test1 {
    private final static JLabel l = new JLabel("Old text");
    public static void main(String[] args) {
        System.err.println(l.getText());
        l.setText("New Text");
        System.err.println(l.getText());
    }
}

Aber du kannst nicht sagen:

l = new JLabel("Newest Text");

Nach der ersten Zuordnung zu l. Beachten Sie, dass Sie dies jedoch tun können:

import javax.swing.JLabel;

class Test1 {
    public static void main(String[] args) {
        final JLabel l;
        String s = getArbitaryString(); // Assume this method returns a string
        l = new JLabel(s);
        System.err.println(l.getText());
    }
}

Dies ist möglich, da bei der Deklaration von l nichts, auch nicht Null, zugewiesen wird. Sie dürfen also nur einmal etwas zuweisen.

Gleiches gilt für Primitive. Sie können einen Wert wie folgt zuweisen: 

class Test1 {
    public static void main(String[] args) {
        final int i;
        i = 2;
    }
}

Jetzt können Sie es jedoch nicht weiter manipulieren, da Sie primitiven Typen nur noch Werte zuweisen können.

16

Sie können nicht ändern, auf welches Objekt oder auf welchen Wert sich eine letzte Variable bezieht. Sie können eine letzte Variable nur einmal zuweisen.

Dies hat keinen Einfluss darauf, ob Sie den Status des Objekts ändern können. Das Objekt selbst kann weiterhin manipuliert werden, sofern es nicht so codiert ist, dass diese Manipulation verboten ist. Ein unveränderliches Objekt ist ein Objekt, dessen Status sich nicht ändern kann.

4
Fred

Wie andere bereits gesagt haben, bedeutet dies, dass Sie das Objekt bearbeiten können, auf das die Variable zeigt, aber Sie können die Referenz nicht ändern (d. H. Der Variablen ein anderes Objekt zuweisen).

Objekte, die vom Design aus veränderlich sind, wie zum Beispiel eine List, können geändert werden (Sie können ihnen Elemente hinzufügen). Wenn Sie jedoch ein unveränderliches Objekt wie String oder Integer haben, können Sie es nicht ändern (alle Operationen der Klasse String unterstützt eine neue Instanz zurück und modifiziert das eigentliche Objekt nicht.

3
pgb

Sie können veränderliche letzte Variablen für z. vom Typ StringBuffer, letzte Variablen von unveränderlichen Typen können jedoch nicht bearbeitet werden .

Bei veränderlichen Variablen wird das neue Objekt nicht bei jeder Wertänderung erstellt. Bei unveränderlichen Typen wird jedoch jedes Mal, wenn Sie den Wert ändern, ein neues Objekt erstellt. Wenn Sie es endgültig machen, können Sie es nicht ändern.

0
deepakraut

Sie können jede Methode darauf aufrufen, selbst wenn die Methode den Status des Objekts ändern kann, auf das der Verweis zeigt. Z.B

final MyClass myClass = new MyClass();
myClass.setVar(something);

Dies ist in Ordnung, da sich myClass selbst nicht ändert, d. H. Sie myClass = myClass1; nicht ausführen.

0
fastcodejava

Ja, die letzte Variable kann geändert werden.

    final StringBuffer s = new StringBuffer();
    // won't work
    s = new StringBuffer();
    //this works
    s.append("hai");

Sie können die Referenz nicht ändern, aber die Felder des Objekts können geändert werden. für mehr Details

0
vaisakh ps

Der, der mich immer umbringt?

Wenn Sie möchten, dass die endgültigen Variablen tatsächlich so sicher sind, wie Sie dachten, waren sie viel zusätzlichen Code, um eine Kopie eines String [] zurückzugeben. 

0
Dean J