25 Stimmen

Statische String-Konstanten VS enum in Java 5+

Ich habe die Frage und die Antworten gelesen: Wie lassen sich Konstanten am besten in Java implementieren?

Und kam zu der Entscheidung, dass enum ist besser Weg, um eine Reihe von Konstanten zu implementieren. Außerdem habe ich ein Beispiel auf der Sun-Website gelesen, wie man das Verhalten zu enum hinzufügen kann (siehe den Link im zuvor erwähnten Beitrag). Es ist also kein Problem, den Konstruktor mit einem String-Schlüssel zur enum hinzuzufügen, um eine Reihe von String-Werten zu speichern.

Das einzige Problem hier ist, dass wir ".nameOfProperty" hinzufügen müssen, um Zugriff auf den String-Wert zu erhalten. Überall im Code müssen wir also den Wert der Konstante nicht nur mit ihrem Namen ansprechen (EnumName.MY_CONSTANT), sondern auf diese Weise (Enum.MY_CONSTANT.propertyName).

Bin ich hier richtig? Was halten Sie davon?

0 Stimmen

Könnten Sie die Frage präzisieren? Verwenden Sie eine Mitgliedsvariable anstelle einer Accessor-Funktion?

0 Stimmen

Wie auch immer. Sagen wir, eine Accessor-Funktion. Das gibt zusätzlich () Die Frage war über Ausführlichkeit, wie KLE und N. Fortescue schrieb. Aber wie gesagt, ich kann toString überschreiben (interessante Entscheidung), und vor allem kann ich sehen, dass die Verwendung von enum hier eine gute Praxis sein kann.

0 Stimmen

@EugeneP Für mich und viele andere, toString() soll ein Debug-String sein (gut bei der Fehlersuche, für technische Protokolle und dergleichen). Das Problem bei der Verwendung dieses Strings im normalen Betrieb der Anwendung besteht darin, dass er eines Tages von jemandem überschrieben wird, um mehr Informationen im Debug-Modus anzuzeigen, weil er denkt, dass dies keinen Einfluss auf das Verhalten der Anwendung hat.

25voto

KLE Punkte 22895

Ja, die Namensgebung mag ein wenig länger erscheinen. Aber nicht so sehr, wie man es sich vorstellen könnte...

  1. Da die Enum-Klasse bereits einen gewissen Kontext bietet ( "Zu welcher Menge von Konstanten gehört dies?" ), der Name der Instanz ist normalerweise kürzer als der Name der Konstante (die starke Typisierung unterscheidet bereits von ähnlich benannten Instanzen in anderen Enums).

  2. Außerdem können Sie statische Importe verwenden um die Länge weiter zu reduzieren. Man sollte sie nicht überall verwenden, um Verwechslungen zu vermeiden, aber ich denke, dass ein Code, der stark mit der Aufzählung verbunden ist, damit gut zurechtkommt.

  3. Sur schaltet auf die Aufzählung, verwenden Sie nicht den Klassennamen. (Bei Strings vor Java 7 sind nicht einmal Schalter möglich).

  4. In der Enum-Klasse selbst verwenden Sie die Kurznamen.

  5. Da Enums über Methoden verfügen, könnten viele Low-Level-Codes, die die Konstanten intensiv nutzen würden, von einem Business-Code in die Enum-Klasse selbst migrieren (entweder dynamische oder statische Methode). Wie wir gesehen haben, Umstellung des Codes auf das Enum reduziert die Verwendung langer Namen noch weiter.

  6. Konstanten werden oft in Gruppen behandelt, wie z. B. eine if die auf Gleichheit mit einer von sechs Konstanten oder vier anderen usw. prüfen. Enums sind ausgestattet mit EnumSets mit einer contains Methode (oder eine ähnliche dynamische Methode, die die entsprechende Gruppe zurückgibt), mit der Sie eine Gruppe wie eine Gruppe behandeln (als sekundärer Vorteil ist anzumerken, dass diese beiden Implementierungen der Gruppierung außerordentlich schnell sind - O(1) - und wenig Speicher benötigen!)

Mit all diesen Punkten, Ich habe herausgefunden, dass die tatsächlichen Codes sehr viel kürzer sind !

7voto

Nick Fortescue Punkte 41671

Was die Frage nach den Konstanten betrifft, so sollten Enums Konstanten darstellen, die alle vom gleichen Typ sind. Wenn Sie beliebige Konstanten verwenden, ist dies der falsche Weg, aus Gründen, die in der anderen Frage beschrieben wurden.

Wenn Sie nur String-Konstanten wollen, haben Sie im Hinblick auf ausführlichen Code Recht. Sie könnten jedoch die Methode toString() überschreiben und den Namen der Eigenschaft zurückgeben. Wenn Sie nur den String mit anderen Strings verketten wollen, erspart Ihnen das einige zusätzliche Ausführlichkeit in Ihrem Code.

Haben Sie jedoch die Verwendung von Eigenschaftsdateien oder eine andere Möglichkeit der Internationalisierung in Betracht gezogen? Wenn Sie Strings definieren, geht es oft um Meldungen für die Benutzeroberfläche. Wenn Sie diese in eine separate Datei extrahieren, können Sie sich in Zukunft viel Arbeit ersparen, und die Übersetzung wird viel einfacher.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X