wake-up-neo.com

'public static final' oder 'private static final' mit Getter?

In Java wird gelehrt, dass Variablen privat gehalten werden sollten, um eine bessere Kapselung zu ermöglichen. Was ist jedoch mit statischen Konstanten? Diese:

public static final int FOO = 5;

Wäre dem Ergebnis gleichwertig:

private static final int FOO = 5;
...
public static getFoo() { return FOO; }

Aber was ist eine bessere Praxis?

41
Chris Cummins

Es gibt einen Grund, eine Konstante nicht direkt in Ihrem Code zu verwenden.

Angenommen, FOO kann sich später ändern (bleibt aber konstant), etwa zu public static final int FOO = 10;. Sollte nichts kaputt gehen, solange niemand dumm genug ist, den Wert direkt richtig zu kodieren?

Der Java-Compiler fügt Konstanten wie Foo oben in den aufrufenden Code ein, d. H. someFunc(FooClass.FOO); wird someFunc(5);. Wenn Sie jetzt Ihre Bibliothek neu kompilieren, aber nicht den aufrufenden Code, können Sie in überraschende Situationen geraten. Das wird vermieden, wenn Sie eine Funktion verwenden - die JIT wird sie dennoch optimal optimieren, so dass hier keine wirkliche Leistung erzielt wird.

56
Voo

Da eine endgültige Variable später nicht geändert werden kann, wenn Sie sie als globale Konstante verwenden, machen Sie sie einfach öffentlich.

7
Serdar Dogruyol

Getter ist hier sinnlos und wird höchstwahrscheinlich von der JVM festgelegt. Halten Sie sich einfach an die öffentliche Konstante.

Die Idee hinter der Kapselung besteht darin, unerwünschte Änderungen einer Variablen zu schützen und die interne Darstellung zu verbergen. Bei Konstanten macht es nicht viel Sinn.

3

Verwenden Sie die Variales außerhalb der Klasse als:

public def FOO:Integer = 5; 

Wenn Sie die Kapselung nicht Ihre Priorität haben. Verwenden Sie andernfalls die zweite Variante, um eine Methode und nicht die Variable verfügbar zu machen.

private static final int FOO = 5;
...
public static getFoo() { return FOO; }

Ist auch eine bessere Vorgehensweise für die Codewartung, um sich nicht auf Variablen zu verlassen. Denken Sie daran, dass "vorzeitige Optimierung die Wurzel allen Übels ist".

2
profimedica

Der erste, wenn das getFood-Ergebnis konstant ist und zur Laufzeit nicht ausgewertet werden muss.

0
dash1e

Die Verwendung von Setter und Getter für Member hat den Vorteil, ..__ überschreiben zu können. Dies gilt nicht für statische "Methoden" (eher Funktionen).

Es gibt auch keine Möglichkeit, statische Methoden für Schnittstellen zu definieren.

Ich würde mit dem Feldzugang gehen

0
stefan bachert

Ich würde bei getFoo () bleiben, da Sie in Zukunft die Implementierung ändern können, ohne den Client-Code zu ändern. Wie @Tomasz feststellte, wird die JVM Ihre aktuelle Implementierung wahrscheinlich inline einbinden, so dass Sie einen erheblichen Leistungsnachteil zahlen.

0
shams