Wie deklariere ich eine Methode, die die Klassenmitglieder in Java nicht ändern kann? [Duplikat]
In C ++ führen wir eine konstante Methode durch, sodass der Wert der Klassenmitglieder nicht geändert werden kann. Wie kann ich dies jedoch in Java tun? Ich habe die endgültige Methodendeklaration ausprobiert, die den Konstanten in C ++ entspricht, aber die endgültigen Methoden sind eine andere Sache. Ich möchte eine Getter-Methode erstellen, damit sie die Werte nicht ändern, sondern nur lesen kann. Wie eine schreibgeschützte Methode.
Antworten
In Java ist es nicht möglich , deklarativ zu verhindern, dass eine Methode nicht endgültige Felder ändert. In Java gibt es keine "const-Korrektheit".
Wenn ein Klassenfeld nicht ist final
, kann es durch eine beliebige Methode der Klasse geändert werden.
Beachten Sie, dass final
Felder und Variablen anders funktionieren als Methoden und Klassen:
- Ein
final
Feld oder eine Variable ist eine Konstante. Sein Wert kann nach seiner Zuweisung nicht mehr geändert werden. - Eine
final
Methode kann nicht von untergeordneten Klassen überschrieben werden.final
on Methoden hat nichts mit "Konstanz" zu tun. - Eine
final
Klasse kann nicht erweitert werden.final
on classes hat nichts mit "constness" zu tun.
Ihre Optionen in Java sind:
- Machen Sie Ihre Klasse unveränderlich (dh markieren Sie alle ihre Felder
final
). - Schreiben Sie einfach Ihre Getter (und andere Nicht-Mutator-Methoden) sorgfältig :)
Noch eine Anmerkung. Selbst bei Feldern und Variablen unterscheidet sich Java final
von C ++ const
. Beispielsweise:
final
Variablen können nach der Zuweisung nicht mehr geändert werden, aber Sie können sie nach der Deklaration zuweisen . Beispiel:final int value; if (condition) { value = 1; // Ok! } else { value = 2; // Ok! } value = 3; // Compile error: value already assigned.
final
Klassenfelder müssen zugewiesen werden - entweder direkt oder aus einem Konstruktor heraus. Diese Felder können jedoch an einer beliebigen Stelle innerhalb eines Konstruktors zugewiesen werden . Es gibt keine spezielle Sache wie die "Initialisierungsliste" von C ++ in Java.Die Feld- / Variablen- / Parameterdeklaration
final Object obj
in Java entspricht in etwa einer (const-) Referenz auf ein Nicht-const-Objekt in C ++. Das bedeutet, dass Sie nicht erneut zuweisen die Referenz , aber Sie können sich das referenzierte Objekt ändern. Ein Beispiel:// Note that (obsolete) Date class is mutable in Java. final Date myDate = new Date(); myDate = new Date(); // Compilation error: can't reassign a final reference! myDate.setTime(4711); // Ok, mutating referenced object is allowed!
Das kannst du nicht tun. Die endgültige Methode bedeutet, dass sie nicht überschrieben werden kann.