Es scheint an dieser Stelle eine Java-Orthodoxie zu sein, dass man grundsätzlich niemals öffentliche Felder für den Objektzustand verwenden sollte. (Ich stimme dem nicht unbedingt zu, aber das ist für meine Frage nicht relevant.) Wäre es angesichts dessen richtig zu sagen, dass Javas öffentliche Felder aus heutiger Sicht ein Fehler des Sprachdesigns waren? Oder gibt es ein rationales Argument dafür, dass sie auch heute noch ein nützlicher und wichtiger Bestandteil der Sprache sind?
Vielen Dank!
Update: Ich kenne die eleganteren Ansätze wie C #, Python, Groovy usw. Ich suche nicht direkt nach diesen Beispielen. Ich frage mich wirklich nur, ob sich noch jemand tief in einem Bunker befindet, der darüber murmelt, wie wundervoll öffentliche Felder wirklich sind und wie die Massen nur Schafe usw. sind.
Update 2: Eindeutig statische öffentliche Endfelder sind die Standardmethode zum Erstellen öffentlicher Konstanten. Ich bezog mich mehr auf die Verwendung öffentlicher Felder für den Objektzustand (sogar den unveränderlichen Zustand). Ich denke, es scheint ein Konstruktionsfehler zu sein, öffentliche Felder für Konstanten zu verwenden, aber nicht für den Zustand. Die Regeln einer Sprache sollten natürlich durch Syntax und nicht durch Richtlinien durchgesetzt werden.
Antworten:
Ich mag sie, solange das Feld endgültig ist und nur intern in der Anwendung verwendet wird und nicht in einer API für andere Anwendungen verfügbar gemacht wird. Dies hält Ihren Code kürzer und lesbarer.
Sie sollten keine öffentlichen Felder in einer API verfügbar machen, da Sie durch das Bereitstellen öffentlicher Felder auch die Implementierung verfügbar machen. Wenn Sie es
getXXX()
stattdessen als Methode verfügbar machen, können Sie die Implementierung ändern, ohne die API-Schnittstelle zu ändern. Beispielsweise könnten Sie den Wert von einem Remote-Dienst ändern und abrufen, aber die Anwendungen, die die API verwenden, müssen dies nicht wissen.Dies ist ein praktikables Design für
public final
Felder in unveränderlichen Klassen.Aus effektivem Java :
Siehe auch Warum sollte ich keine unveränderlichen POJOs anstelle von JavaBeans verwenden?
quelle
getXXX()
stattdessen als Methode verfügbar machen, können Sie die Implementierung ändern, ohne die API-Schnittstelle zu ändern. Sie können den Wert beispielsweise von einem Remotedienst ändern und abrufen, aber die Anwendungen, die die API verwenden, müssen dies nicht wissen.Die Verwendung von Get / Set-Methodenpaaren ist der tragische historische Konstruktionsfehler. Ich kann mir keine andere Sprache vorstellen, die Eigenschaften so wörtlich und ineffizient implementiert.
quelle
Ich denke, dass öffentliche Felder für eine Klasse in Ordnung sind, die im Wesentlichen ein Wertetyp wie eine komplexe Zahl oder ein Punkt ist, bei dem die Klasse nur primitive Typen wie eine C-artige Struktur gruppiert und möglicherweise einige Operatoren definiert.
quelle
java.awt.Point
und Freunde sind ein Albtraum.Point
ist, dass es nicht eindeutig ist, ob eine Variable vom TypPoint
Standorte einkapseln soll oder die Identität einer Entität mit einem Standort, der sich ändern kann. Konzeptionell würde ich Code, der herumreichtPoint
, als ähnlich wie Code ansehen, der um Arrays herumreicht.Point
und es ändere, sollte ich erwarten, dass das Objekt, auf das es verweist, auf dem Bildschirm sauber aktualisiert wird? Nein, das ProblemPoint
ist, dass es veränderlich ist. Wir hattenString
/StringBuffer
aber die Idee schien nicht durchzukommen. / Das Weitergeben von Arrays hat ähnliche Probleme.Es ist immer noch nützlich, öffentliche Konstanten zu definieren. Z.B
Ziehen Sie jedoch nach Möglichkeit immer noch Aufzählungen vor . Z.B
Es ist auch nützlich, einfache Strukturklassen zu simulieren . Kein Grund, für jedes Feld einen Getter und Setter zu erstellen, wenn sie doch alle öffentlich sind.
quelle
Bevor sich IDEs verbreiteten, war es ein mächtiges Werkzeug, alle Ihre Felder öffentlich zu machen, um schnell Prototypen / Proofs von Konzepten zu erstellen.
Heutzutage gibt es kaum eine Entschuldigung dafür, wenn Sie mit einem Mausklick ein Getter / Setter-Paar generieren können.
quelle
public final
Felder sind jedoch lesbarer als 10getXXX()
Methoden.const
Schlüsselwort wäre ausreichend. Wenn sie nicht statisch sind, stellen sie eine schwerwiegende Verletzung der Kapselung dar.Dies ist subjektiv, aber meiner Meinung nach ist der gesamte öffentliche / private Begriff veraltet und rückständig.
In Python gibt es keine öffentlichen / privaten; alles ist grundsätzlich öffentlich. Hat nicht viele Probleme verursacht.
In Java neigen Sie dazu, sinnlose Getter / Setter für jedes Feld zu erstellen, um die Sünde zu vermeiden, sie als "öffentlich" zu kennzeichnen. (IMHO, wenn Sie feststellen, dass Sie das tun, sollten Sie sie nur öffentlich markieren).
quelle