Wie deklariere ich eine Methode, die die Klassenmitglieder in Java nicht ändern kann? [Duplikat]

Nov 30 2020

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

10 AlexShesterov Nov 30 2020 at 17:16

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 finalFelder und Variablen anders funktionieren als Methoden und Klassen:

  • Ein finalFeld oder eine Variable ist eine Konstante. Sein Wert kann nach seiner Zuweisung nicht mehr geändert werden.
  • Eine finalMethode kann nicht von untergeordneten Klassen überschrieben werden. finalon Methoden hat nichts mit "Konstanz" zu tun.
  • Eine finalKlasse kann nicht erweitert werden. finalon classes hat nichts mit "constness" zu tun.

Ihre Optionen in Java sind:

  1. Machen Sie Ihre Klasse unveränderlich (dh markieren Sie alle ihre Felder final).
  2. Schreiben Sie einfach Ihre Getter (und andere Nicht-Mutator-Methoden) sorgfältig :)

Noch eine Anmerkung. Selbst bei Feldern und Variablen unterscheidet sich Java finalvon C ++ const. Beispielsweise:

  • finalVariablen 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.
    
  • finalKlassenfelder 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 objin 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!
    
salapura.stefan Nov 30 2020 at 17:17

Das kannst du nicht tun. Die endgültige Methode bedeutet, dass sie nicht überschrieben werden kann.