3 Stimmen

Warum werden bei der Erstellung einer unveränderlichen Klasse die Felder als privat deklariert?

Beim Erstellen einer unveränderlichen Klasse werden alle Felder als final deklariert, sodass ihr Wert nicht geändert werden kann. Das ist in Ordnung, aber warum deklarieren wir sie auch als private?

4voto

NPE Punkte 462670

Wenn das Feld auf ein veränderbares Objekt verweist, verhindert final, dass der Verweis auf ein anderes Objekt umgebunden wird. Das Objekt kann jedoch immer noch modifiziert werden, wodurch die Unveränderlichkeit des enthaltenden Objekts umgangen wird.

Um dies zu verhindern, können Sie das Feld private machen (wenn sie es nicht sehen können, können sie es nicht modifizieren).

Zum Beispiel:

public class Order {
  public final List order_lines = ...;
}

Hier kann jeder hereinkommen und die Bestellung durch Hinzufügen/Entfernen/Ändern von Bestellzeilen modifizieren, auch wenn order_lines final ist.

0voto

templatetypedef Punkte 343693

Ein unveränderliches Objekt kann sich nach seiner Erstellung nicht ändern, aber das bedeutet nicht, dass es zwangsläufig eine einfache Implementierung hat, die für alle Clients exportiert werden sollte. Als Beispiel nehmen Sie den String-Typ, der viele verrückte Optimierungen hinter den Kulissen verwendet, um die Effizienz für gängige Fälle zu maximieren (zum Beispiel, das Teilen eines Pufferarrays beim Verwenden von substring). Durch das Verbergen aller Felder der Klasse kann die Implementierung versuchen, von zeitsparenden oder speichersparenden Optimierungen zu profitieren und den Zugriff auf die gespeicherten Daten über die öffentliche Schnittstelle zu vermitteln. Wenn diese Felder öffentlich wären, wäre es schwierig (wenn nicht unmöglich), die Implementierung nachträglich zu ändern.

Anders ausgedrückt, Unveränderlichkeit impliziert nicht zwangsläufig Kapselung oder umgekehrt.

Hoffe, das hilft!

0voto

porfiriopartida Punkte 1536
public class Person{
   public Date birthDate = new Date(615666470l); 
}

Dann könnte das Geburtsdatum einer Person von außen aktualisiert werden.

Person porfiriopartida = new Person();
porfiriopartida.birthDate=new Date(931199270); 

Wenn Sie einen Konstruktor mit den erforderlichen Anfangsattributen bereitstellen und dann nur Referenzen auf die Werte zulassen, würde das funktionieren.

Denken Sie auch daran, keine tatsächlichen Objekte in den get-Methoden zurückzugeben (zumindest solche, die selbst unveränderlich sind).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X