So erstellen Sie eine unveränderbare Klasse in Java

8

Wie kann unveränderliche Klasse in Java erstellt werden. Wenn die Klasse Student eine Beziehung (Adresse) zum Erstellen einer unveränderlichen Klasse hat. Ich möchte die Klasse unten unveränderlich machen

%Vor%

Hier können wir Adressinstanzen ändern. Bitte gib mir eine Idee

    
user2832497 25.12.2013, 04:03
quelle

4 Antworten

15

Die wichtigsten Punkte für unveränderlich sind:

  • keine Setter-Methoden
  • mache Variablen privat und endgültig
  • gibt Listen mit Collections.unmodiableList zurück - gibt niemals ein veränderbares Feld zurück; gebe immer entweder eine Kopie (tief, falls zutreffend) oder eine unveränderbare Version des Feldes
  • zurück
  • Machen Sie die Klasse final
  • Wenn Variablen intern in der Klasse geändert werden, ist diese Änderung nicht sichtbar und hat keine Auswirkungen außerhalb der Klasse (einschließlich der Auswirkungen auf Dinge wie equals() und hashcode() ).
Scary Wombat 25.12.2013 04:06
quelle
4

In deiner Klasse Address solltest du deine Felder private (sollte) und final (muss), wie dies -

machen %Vor%

Sie können auch keine Setter-Methoden verwenden, aber wenn die Felder final sind, ist das kein großes Problem (da jede Setter-Methode einen Compilerfehler ergeben würde).

    
Elliott Frisch 25.12.2013 04:07
quelle
2

Nun, du hast Student halbwegs unveränderlich gemacht:

  • Seine Attribute sind endgültig
  • sie sind von unveränderlichen Typen (außer der Adresse)
  • und sie werden im Konstruktor initialisiert.

Sie sollten dasselbe auf Address class anwenden, damit es unveränderlich wird, und dann wird der gesamte Status von Student unveränderlich sein. So wird es sein:

%Vor%

Glücklicherweise haben Sie keine modifizierbaren Typen (einige der bekanntesten sind Date , Collection s und Maps ), ansonsten sollten Sie sie auch berücksichtigen.

Wenn Sie veränderbare Attribute hatten, müssen Sie sie im Konstruktor kopieren, und Sie sollten eine unmodifizierbare oder eine Kopie davon zurückgeben, wenn der Zustand undicht ist.

Wenn Ihre Student -Klasse zum Beispiel ein birthDate -Attribut hat, sollten Sie etwas tun wie:

%Vor%     
Amir Pashazadeh 25.12.2013 04:11
quelle
0

Das ist genug. final deklariert kann nicht mutiert werden und da Getter im Konstruktor als Argumente benötigt werden, sind Getter redundant.

%Vor%

address und studentId/id wären jedoch bessere Namen für die Felder.

    
Florian Salihovic 23.05.2014 10:05
quelle

Tags und Links