Ist es besser, Strings oder Int zu verwenden, um Enums außerhalb des Java-Teils des Systems zu referenzieren?

10

Wir hatten bei meiner Arbeit eine Diskussion über die Verwendung von Enums in Java.

Ein Mitarbeiter argumentierte, dass bei Verwendung von Aufzählungen auf der Serverseite bei Bedarf eine Zeichenfolge verwendet werden sollte, um darauf zu verweisen (z. B. beim Senden von Daten von JS an den Server oder beim Speichern in der Datenbank), und argumentierte, dass dies viel klarer ist für den Entwickler und auch zu argumentieren, dass es bei Tippfehlern schnell scheitern würde.

Ich habe in diesen Fällen immer Ganzzahlen verwendet, um Aufzählungen zu identifizieren, da dies unveränderliche Bezeichner wären und keine Groß- und Kleinschreibung und Tippfehler auftreten würden (auch wenn ein Entwickler den Fehler gemacht hätte, den Wert 2 anstelle von 1 zu verwenden, würde dies nicht schnell fehlschlagen).

Da ich diese Argumente sehr analytisch betrachte, würde ich sagen, dass die Verwendung von Zeichenfolgen besser ist, aber ich habe ein seltsames Gefühl dabei (als ob es kein guter Ansatz wäre).

Gibt es eine bewährte Methode für diese Diskussion, die mich leiten könnte?

Bearbeiten: Wann immer es möglich ist, verwenden wir die Aufzählung selbst, sodass unser gesamter Java-Code die Aufzählung verwendet. Mit "Verweis auf eine Aufzählung" meine ich: Verweisen auf den Wert in der Aufzählung beim Austausch von Daten aus JavaScript zum Server oder beim Speichern von Daten in der Datenbank

JSBach
quelle
1
Was ist für Sie ein "Verweis auf eine Aufzählung"? Normale Verwendung im Quellcode? Serialisierung zum Speichern in einer Datenbank? Ausdruck zur Verwendung in der Benutzerdokumentation? Ausdruck zur Verwendung in der technischen Dokumentation? Die Antwort wird für alle sehr unterschiedlich sein.
Kilian Foth
Ich habe die Frage bearbeitet und hoffe, dass sie jetzt klarer ist: Mit "Verweis auf eine Aufzählung" meine ich den Verweis auf den Wert beim Austausch von Daten von JavaScript auf den Server oder umgekehrt oder beim Speichern eines Werts in der Datenbank
JSBach
In der Javascript-API würde ich sicherlich Zeichenfolgen verwenden. In der DB haben beide ihre Vorteile. Einige Datenbanken verfügen über eine integrierte Enum-Unterstützung.
CodesInChaos

Antworten:

15

Gute Frage. Die Verwendung von Enum in Java ist in erster Linie dazu gedacht, Informationen zu verarbeiten, die etwas kategorischer Natur sind. Das klassische Beispiel ist die Verwendung von Enum für die vier Arten von Farben, die eine Karte haben könnte. Es bietet alle Leistungsvorteile der Verwendung einer Ganzzahl und ist auch in Ihrem Programm klar.

Warum sollten Sie außerhalb von Java keine Ganzzahl mehr verwenden? Vielleicht haben Sie keine Aufzählungstypen außerhalb von Java, obwohl das nicht bedeutet, dass Sie Integer nicht weiter für Leistungszwecke verwenden können, oder? Ja, das ist völlig richtig. Überlegen Sie jedoch, was passiert, wenn Sie einen neuen Aufzählungswert hinzufügen. Wenn Sie es nicht am Ende hinzufügen, werden alle anderen Aufzählungswerte nach dem neuen Wert um eins erhöht. Nun, wir geben nur die Nummer an, damit sie sich nicht ändern kann, oder wir fügen sie immer am Ende hinzu. Sind Sie zuversichtlich, dass Ihre Kollegen das immer richtig machen werden? Meh? Wahrscheinlich? Hoffnungsvoll? Vielleicht bist du nicht zu 100% dabei. Denken Sie eine Sekunde daran.

Ihr Chef teilt Ihnen mit, dass der Client, der Ihre Software verwendet, nach dem letzten Update ein Durcheinander aufweist. Jetzt verhalten sich alle Entitäten X so, als ob ihnen der Aufzählungswert Y zugewiesen wurde, auch wenn ihnen tatsächlich Z zugewiesen wurde. Sie überprüfen das Repository und ja, jemand hat einen neuen Aufzählungswert hinzugefügt und Ihre Richtlinien nicht befolgt, wie Sie es von ihm verlangt haben. Jetzt haben Sie die zusätzliche Komplikation , dass auf der Datenbank es 4 geschrieben wird, wenn es wirklich 3 sein sollte, mit Ausnahme von Aufzeichnungen , die vor dem Update eingeführt wurden , die wirklich sind 4. Welche Enum - Wert bezieht sich auf 4 überhaupt? Ist es nicht Y? Du kannst dich nicht erinnern. Sie müssen das Programm überprüfen, um zu überprüfen. Einfach gesagt, es ist ein Chaos.

Wenn Ihre Datenbank stattdessen "HEARTS", "DIAMONDS", "SPADES", "CLUBS" geschrieben hat, haben Sie wenig Platz verloren und so viel gewonnen. Es ist wahr, dass es sich um einen kleinen Leistungseinbruch handelt, aber Sie sollten wirklich nicht so oft auf die Datenbank zugreifen, um einen Unterschied zu machen. Überlassen Sie den Speicherplatz den Systemadministratoren (nicht Ihrem Problem).

Wenn Sie ein einfaches Programm erstellt haben, an dem Sie leicht Änderungen vornehmen können, haben Sie sich auf lange Sicht einen Gefallen getan. Vertrauen Sie mir. Dieser Aspekt ist meiner bescheidenen Meinung nach nicht anders.

Neil
quelle
2
Gute Punkte, aber Sie vergessen den Fall, dass jemand beschließt, den Namen einer der Enum-Entitäten ( HEARTSin Heartoder etwas in Ihrem Beispiel) zu ändern, und plötzlich alles wieder kaputt geht.
Scott Whitlock
1
@ScottWhitlock Nicht, wenn Sie dies berücksichtigen, obwohl sie sich entscheiden könnten, es vollständig umzubenennen. Sie könnten versehentlich die Datenbank löschen und auch das Projekt löschen, aber wir können hier nicht jeden möglichen Vorfall berücksichtigen.
Neil
5
@Neil - stimmt, aber wir versuchen hier die Chancen zu spielen. Ich bin mit Java-Aufzählungen nicht vertraut, aber in C # setze ich die Werte für Aufzählungen explizit, wenn die Werte außerhalb des Programms eine Bedeutung haben müssen (z. B. in einer Datenbank) (z. B. Hearts = 1, Diamonds = 2 usw.). . Da dies nicht die Standardmethode für die Verwendung einer Aufzählung ist, sollte eine spätere Editorpause eingelegt werden. Außerdem ist ein Kommentar, der angibt, wo diese sonst noch verwendet werden, praktisch.
Scott Whitlock
1
@ScottWhitlock Das ist definitiv der bessere Weg, um solche Probleme zu vermeiden. Angenommen, Sie haben dies getan, sehen Sie immer noch 1, 2, 3, 4 in der Datenbank oder in einer Datei serialisiert. Unter Wartungsgesichtspunkten in keiner Weise ideal.
Neil
2
Wenn ich hinzufügen darf, wenn die Aufzählung als Zeichenfolge serialisiert ist und jemand den Namen einer Aufzählung ändert, tritt der Fehler während der Deserialisierung während der Analyse auf. Wenn die Aufzählung int ist und jemand die Definition ändert, tritt der Fehler während der Verarbeitung weiter unten auf, was schwieriger zu diagnostizieren ist. CC @ScottWhitlock.
Endy Tjahjono
1

Ich stimme Neils Antwort zu, aber nur eine Ergänzung:

In Java sind Enums Objekte, daher können sie Felder und Methoden haben. Sie können also jeder Aufzählung einen manuell festgelegten Wert geben. Wenn Sie ihn für externe Arbeiten referenzieren, verwenden Sie stattdessen diesen Wert.

Es wird sowohl das Hinzufügen / Entfernen / Neuordnen als auch das Ändern des Namens der Enum-Instanz überleben. Sie müssen jedoch eine Serialisierungs- / Deserialisierungslogik für Enum-Felder schreiben, anstatt die in vielen Tools verfügbare Automagic zu verwenden. (Es ist einfach, aber es ist zusätzliche Arbeit).

Und Sie müssen diese Werte manuell eindeutig halten (dies gilt jedoch auch für Aufzählungen im C-Stil), und Sie können einen Test schreiben, um dies zu überprüfen.

user470365
quelle
Ja, wir sind diesen Weg gegangen, aber wir verwenden den Ruhezustand und mussten zusätzlichen Code hinzufügen, um den Wert in / aus der Datenbank analysieren zu können. Es schien irgendwie seltsam, also haben wir uns für die .STRING-Beziehung und entschieden gehe mit dem Aufzählungsnamen.
JSBach