2016-11-22 3 views
2

Wird empfohlen, öffentliche Zugriffsmodifikatoren für die Datenfelder in der finalen (unveränderlichen) Java-Klasse zu haben, auch wenn die Datenfelder nicht die Verweise auf veränderlichen Datentyp sind oder auf Datenfelder zugreifen sollen direkt, da Datenfelder im Konstruktor selbst definiert werden sollten, und somit alle Möglichkeiten, die interne Repräsentation der Klasse zu ändern, zunichte machen. Bitte vorschlagen?Zugriffsmodifikatoren in Java bei Verwendung mit unveränderbarer Klasse

Zum Beispiel:

public class MainApp { 

    public static void main(String args[]) { 

     Immutablesample immutablesample = Immutablesample.getInstance("akkhil"); 

     System.out.println(" Before modification " + immutablesample.getName()); 
     immutablesample.name = "gupta"; 
     System.out.println(" After modification " + immutablesample.getName()); 
    } 

} 

ist der aufrufende Code versucht, das Datenfeld zu ändern, indem sie direkt (ohne Zugriffsmodifikator) für die folgende Klasse Zugriff auf:

public final class Immutablesample { 


    private final String name; 

    private Immutablesample(String name){ 
     this.name = name; 
    } 

    public String getName(){ 
     return name; 
    } 

    public static Immutablesample getInstance(String name){ 
     return new Immutablesample(name); 
    } 
} 

Wie wäre es, die machen Klasse anfällig für die Änderung der internen Repräsentation, wenn ich den Modifikator von privat auf öffentlich ändere private String name; zum öffentlichen String-Namen; seit das Objekt mit parametrisierten Konstruktor erstellt hat so hat unveränderliche Datenfelder, als warum ist es notwendig, Datenfelder privat zu machen?

+1

Können Sie ein oder zwei Beispiele veröffentlichen? Ihr Mangel an Interpunktion und richtiger Terminologie macht es schwierig, die Frage zu verstehen. –

+0

finden Sie alle Details hier: https://docs.oracle.com/javase/tutorial/essential/concurrency/imstrat.html – grsdev7

+0

Nein. Datenfelder sollten immer privat und endgültig sein. Stellen Sie nur Getter zur Verfügung (die bei Bedarf auch defensive Kopien von veränderbaren Instanzen zurückgeben können) – TheLostMind

Antwort

2

Zwei einfache Regeln zu befolgen:

  1. Versuchen Sie, Ihre ganze Klasse als „unveränderlich“ zu machen, wie Sie können. Zum Beispiel Einstellung private final Felder nur über Konstruktoren. Und wenn Sie "eingehende" Sammelobjekte verwenden, denken Sie daran, eine Kopie ihres Inhalts zu erstellen, um wirklich auf der sicheren Seite zu sein.
  2. Denken Sie daran, dass eine gute OO über das Aussetzen Verhalten; nicht über die Belichtung Daten. Bedeutung: Sie tun absolut nicht wollen Felder öffentlich machen, es sei denn, Sie haben wirklich gute Gründe, dies zu tun. Mit anderen Worten: Sie tun nicht wollen, dass einige andere Klasse B etwas wegen des Inhalts einiger Felder in Klasse A tut. Und die Möglichkeit, das zu verhindern: machen Sie Ihre Felder privat!
1

Im Allgemeinen ist es eine schlechte Entscheidung, Ihre innere Präsentation einer Klasse zu zeigen, also ist es viel besser, wenn Sie sogar endgültige unveränderliche Felder verstecken. Sie können nur solche Felder anzeigen, wenn es sich bei Ihrer Klasse um ein Tupel handelt, bei dem alle Mitglieder von außen verwendet werden.

Verwandte Themen