Java: public final Werte: Gute oder schlechte Praxis?

iTobi97

Aktives Mitglied
Hallo liebe Community,
ich habe eine Frage zu public final-Variablen. Ich bin Informatik-Student und uns hat man es so beigebracht, feste Werte als public final zu deklarieren, und keine Getter für die Konstanten zu verwenden. Dieses Konzept habe ich bisher immer verwendet, um feste Werte wie z.B. eine Bezeichnung/Name an ein Objekt unveränderlich zu "binden".

Mir ist jedoch kürzlich in IntelliJ eine Anmerkung an all meinen public final Werten aufgefallen: "Access can be private", und ich habe mich natürlich gewundert, denn der Sinn von dem public ist ja, von außen ohne Getter darauf zuzugreifen.

Außerdem bin ich in Foren auf die Aussage gestoßen, dass final-Werte nicht effektiv unveränderlich sind ("immutable") und aus diesem und anderen Gründen final Werte nicht public sein sollten.

Kann mir jemand bitte erklären, was es damit auf sich hat, und wie man am besten mit solchen Werten umgehen sollte? (Also public oder mit Getter, etc...)

Vielen Dank schon einmal im Voraus
 
@iTobi97
Ganz einfach: wenn der Wert auch außerhalb der bestimmten Klasse Verwendung findet, als Beispiel die Klasse Math mit der Klassenvariable PI, dann sollte man diesen Wert als eine statische, finale Variable deklarieren.
Wenn der Wert nur innerhalb einer Klasse zur Verwendung kommt, dann kann die Variable auch privat deklariert sein.
 
Üblich ist, für alle Werte des Objekts selbst (wenn nötig) Getter zu verwenden, unabhängig ob final oder nicht
* Den "Client" geht es nichts an, ob der Wert final ist oder nicht.
* Das Interface bliebt "sauber" und es werden keine Zugriffsarten gemischt.
* Einen Vorteil von public final vs getter seh ich nicht wirklich

Außerdem bin ich in Foren auf die Aussage gestoßen, dass final-Werte nicht effektiv unveränderlich sind ("immutable") und aus diesem und anderen Gründen final Werte nicht public sein sollten.
Ja - allerdings ist das "private" genauso "nicht privat", von daher sollte das kein Argument sein.


Was @Javinner meint, sind "Konstanten", also "static final"-Werte, für die verwendet man üblicherweise keine Getter, sondern einen jeweils passenden Scope.
 
@mrBrown Vielen Dank für deine ausführliche Antwort! Du sagst also, dass man für public final Werte, auf die man von außen zugreifen muss, eher Getter verwenden sollte (wenn diese nicht static sind)?
Kann es außerdem sein, dass mit den immutable Werten die mögliche Manipulation mittels Reflections gemeint ist?
 
Also für mich sind die einzigen Einsatzbereiche solcher pubic final variablen in Java eigentlich der Ersatz für #define in C/C++. Und hier benutze ich dann immer public static final und schreibe diese komplett groß wie eben auch die ganzen Frameworks und API's es machen.

Gruß

Claus
 
@mrBrown Vielen Dank für deine ausführliche Antwort! Du sagst also, dass man für public final Werte, auf die man von außen zugreifen muss, eher Getter verwenden sollte (wenn diese nicht static sind)?
@mrBrown Und sind dann private (statt public) final Werte + Getter angesagt?
Alles was zum Objekt gehört: private (oder uU default/protected) und wenn möglich final und wenn nötig mit Getter.

Alles, was Konstanten sind, static und final und ohne Getter, dafür mit passendem Scope, der alles von private bis public sein kann 😉

Kann es außerdem sein, dass mit den immutable Werten die mögliche Manipulation mittels Reflections gemeint ist?
Genau, damit ist aber nicht nur final, sondern eben alles umgehbar.
 

Zurück
Oben