2017-05-16 6 views
0

Ich habe ein paar Fragen im Zusammenhang mit immutable Klassenfelder.Unveränderliche Klassen Felder Abfragen

Angenommen, ich habe eine Klasse Student:

public class Student { 

    private final int empId; 
    public int getEmpId() { 
     return empId; 
    } 

    public Student(int empId) { 
     this.empId=empId; 

    } 
} 

Frage 1: Warum sein notwendigen das Feld als private endgültig zu definieren?

Frage 2: Warum final zusammen mit private erforderlich ist. Wie wenn wir das Feld als final deklariert haben, wird es außerhalb der Klasse nicht sichtbar sein?

Frage 3: Warum können wir es public final nicht machen?

Vielen Dank im Voraus.

Antwort

1

Frage 1: Warum ist es notwendig, Feld als private final zu definieren?

Da gibt es sonst eine Möglichkeit, Code hinzuzufügen, der das Feld ändert, und dann ist es nicht mehr unveränderbar.

Frage 2: Warum Finale zusammen mit privaten erforderlich ist. Als wir das Feld als endgültig deklariert haben, wird es außerhalb der Klasse nicht sichtbar sein.

Dieser letzte Satz ist nicht wahr; macht ein Feld final macht es nicht außerhalb der Klasse unsichtbar. Außerhalb der Klasse unsichtbar zu machen ist das Schlüsselwort private.

Frage 3: Warum können wir es nicht endgültig veröffentlichen?

Sie können es machen public final, aber Felder normalerweise private sein sollten und nur direkt von Methoden innerhalb der Klasse zugegriffen werden.

+1

q1) nicht streng wahr, weil eine öffentliche final int ist unverwundbar für die Änderung – Michael

+0

Hallo, Vielen Dank für die Antwort. Für Punkt 2 war es Tippfehler, den ich privat meinte. Frage 2: Warum wird zusammen mit privaten Finale benötigt. Wenn wir das Feld als PRIVATE deklarieren, wird es außerhalb der Klasse nicht sichtbar sein. –

+0

@KamalVerma 'private' hat nicht direkt etwas damit zu tun, ob die Klasse unveränderlich ist oder nicht. Der Punkt über unveränderlich ist: Es sollte nicht möglich sein, den Zustand (die Mitgliedsvariablen) zu ändern, nachdem das Objekt konstruiert und initialisiert wurde. – Jesper

1

Frage 1: Warum ist es notwendig, Feld als private final zu definieren?

Nein, es ist nicht. final ist genug für die Unveränderlichkeit.

Frage 3: Warum können wir es nicht endgültig veröffentlichen?

Wir können es tun.
In Ihrem Beispiel int empId ist out of the Box unveränderlich (wie jedes primitive).
So machen empIdpublic oder private wird den Zustand von Student nicht ändern, während es als endgültig deklariert wird (das ist keine erneute Zuweisung nach Instanziierung der Klasse, die es enthält).

Im Allgemeinen wird die Angabe von Feldern mit einem public Modifizierer nicht empfohlen, da dies das Kapselungsprinzip von OOP vereitelt.

Frage 2: Warum Finale zusammen mit privaten erforderlich ist. Als wir das Feld als endgültig deklarierten, wird es außerhalb der Klasse nicht sichtbar sein?

Nein, der final Modifikator nur das tut, was es oben beschrieben ist, aber trotzdem wie erläutert, in Ihrem Fall (primitive), so dass das Feld sichtbar oder nicht, hat keine Auswirkung auf Unveränderlichkeit es, während es final ist.

+0

"Allgemein ist es nicht ratsam, Felder mit einem öffentlichen Modifikator zu versehen, da dies den Kapselungsprinzip-Mechanismus vereitelt." Der Getter bricht die Kapselung auf die gleiche Weise ab – Michael

+0

@Michael Ja, meistens. Aber es hat einen Unterschied: Einen Wert mit einer Methode zu erhalten, ist sehr flexibel, da es die Verwendung von Polymorphie, Logik, Validierung, Caching usw. ermöglicht. Sie können dies nicht mit Feldzugriff tun. – davidxxx

+0

Ein Getter bricht per Definition die Kapselung die ganze Zeit. Was du wirklich sagst, ist, dass es weniger flexibel ist, es öffentlich zu deklarieren, als einen Getter zu liefern. Die Verkapselung ist in beide Richtungen unterbrochen. – Michael

Verwandte Themen