Heute habe ich einige Fragen auf dieser Site durchgesehen und eine Erwähnung einer enum
Verwendung in Singleton-Mustern über angebliche Vorteile der Thread-Sicherheit für eine solche Lösung gefunden.
Ich habe enum
s noch nie benutzt und programmiere seit mehr als ein paar Jahren in Java. Und anscheinend haben sie sich sehr verändert. Jetzt unterstützen sie OOP sogar voll und ganz in sich.
Antworten:
Sie sollten immer Enums verwenden, wenn eine Variable (insbesondere ein Methodenparameter) nur einen aus einem kleinen Satz möglicher Werte herausnehmen kann. Beispiele wären Typkonstanten (Vertragsstatus: "permanent", "temporär", "Lehrling") oder Flags ("Jetzt ausführen", "Ausführung verschieben").
Wenn Sie Enums anstelle von Ganzzahlen (oder String-Codes) verwenden, erhöhen Sie die Überprüfung der Kompilierungszeit und vermeiden, dass Fehler ungültige Konstanten übergeben, und Sie dokumentieren, welche Werte zulässig sind.
Übrigens kann eine übermäßige Verwendung von Aufzählungen dazu führen, dass Ihre Methoden zu viel bewirken (es ist oft besser, mehrere separate Methoden zu verwenden, als eine Methode, die mehrere Flags verwendet, die ihre Funktionsweise ändern). Wenn Sie jedoch Flags verwenden oder Codes eingeben müssen, Aufzählungen sind der Weg zu gehen.
Was ist als Beispiel besser?
gegen
Ein Methodenaufruf wie:
dann wird:
Im zweiten Beispiel wird sofort klar, welche Typen zulässig sind, Dokumente und Implementierung können nicht nicht synchronisiert werden, und der Compiler kann dies erzwingen. Auch ein ungültiger Anruf gefällt
ist nicht mehr möglich.
quelle
you should *always* use enums when a variable can only take one out of a small set of possible values
. Die Verwendung konstanter Werte als 'Binärflag' (mit logischeror
Verknüpfung) kann für Echtzeitanwendungen nützlich sein, bei denen der Arbeitsspeicher knapp ist.Warum eine Programmiersprachenfunktion verwenden? Der Grund, warum wir überhaupt Sprachen haben, ist für
Aufzählungen verbessern sowohl die Wahrscheinlichkeit der Korrektheit als auch die Lesbarkeit, ohne viel Boilerplate zu schreiben. Wenn Sie bereit sind, Boilerplate zu schreiben, können Sie Aufzählungen "simulieren":
Jetzt können Sie schreiben:
Die Kesselplatte oben hat fast den gleichen Effekt wie
Beide bieten die gleiche Überprüfungshilfe vom Compiler. Boilerplate ist nur mehr Tippen. Wenn Sie jedoch viel tippen, wird der Programmierer effizienter (siehe 1), sodass sich diese Funktion lohnt.
Es lohnt sich auch aus mindestens einem weiteren Grund:
Anweisungen wechseln
Eine Sache, die Ihnen die
static final
obige Aufzählungssimulation nicht bietet , sind schöneswitch
Fälle. Bei Aufzählungstypen verwendet der Java-Switch den Typ seiner Variablen, um den Umfang der Aufzählungsfälle abzuleiten. Für dieenum Color
oben genannten Fälle müssen Sie lediglich Folgendes sagen:Beachten Sie, dass dies nicht
Color.RED
der Fall ist. Wenn Sie keine Aufzählung verwenden, können Sie benannte Mengen nur mitswitch
folgenden Methoden verwenden:Aber jetzt muss eine Variable, die eine Farbe enthält, einen Typ haben
int
. Die nette Compilerprüfung der Enumeration und derstatic final
Simulation ist weg. Nicht glücklich.Ein Kompromiss besteht darin, ein skalarwertiges Element in der Simulation zu verwenden:
Jetzt:
Aber beachten Sie, noch mehr Boilerplate!
Verwenden einer Aufzählung als Singleton
Auf der Boilerplate oben können Sie sehen, warum eine Aufzählung eine Möglichkeit bietet, einen Singleton zu implementieren. Anstatt zu schreiben:
und dann mit darauf zugreifen
wir können nur sagen
das gibt uns das gleiche. Wir können damit durchkommen , weil Java Aufzählungen sind als volle Klassen mit nur wenig syntaktischen Zucker über die oberen bestreut umgesetzt. Dies ist wieder weniger Boilerplate, aber es ist nicht offensichtlich, es sei denn, die Redewendung ist Ihnen vertraut. Ich mag auch nicht die Tatsache, dass Sie die verschiedenen Enum-Funktionen erhalten, obwohl sie für den Singleton nicht viel Sinn machen:
ord
undvalues
usw. (Es gibt tatsächlich eine schwierigere Simulation, bei derColor extends Integer
das mit Switch funktioniert, aber es ist so schwierig, dass es noch mehr ist zeigt deutlich warumenum
eine bessere Idee ist.)Gewindesicherheit
Die Thread-Sicherheit ist nur dann ein potenzielles Problem, wenn Singletons ohne Verriegelung träge erstellt werden.
Wenn viele Threads
getInstance
gleichzeitig aufrufen, während sieINSTANCE
noch null sind, können beliebig viele Instanzen erstellt werden. Das ist schlecht. Die einzige Lösung besteht darin,synchronized
Zugriff hinzuzufügen , um die Variable zu schützenINSTANCE
.Der
static final
obige Code weist dieses Problem jedoch nicht auf. Es erstellt die Instanz eifrig zur Ladezeit der Klasse. Das Laden der Klasse wird synchronisiert.Der
enum
Singleton ist effektiv faul, da er erst bei der ersten Verwendung initialisiert wird. Die Java-Initialisierung wird ebenfalls synchronisiert, sodass mehrere Threads nicht mehr als eine Instanz von initialisieren könnenINSTANCE
. Sie erhalten einen träge initialisierten Singleton mit sehr wenig Code. Das einzig Negative ist die eher obskure Syntax. Sie müssen die Redewendung kennen oder genau wissen, wie das Laden und Initialisieren von Klassen funktioniert, um zu wissen, was passiert.quelle
static final
Felder werden zur Klasseninitialisierungszeit initialisiert , nicht zur Ladezeit. Es ist genau das gleiche wie bei einerenum
konstanten Initialisierung (tatsächlich sind sie unter der Haube identisch). Deshalb war der Versuch, „cleveren“ Lazy-Initialisierungscode für Singletons zu implementieren, selbst in der ersten Java-Version immer sinnlos.Neben den bereits erwähnten Anwendungsfällen finde ich häufig Aufzählungen nützlich, um das Strategiemuster nach einigen grundlegenden OOP-Richtlinien zu implementieren:
Das einfachste Beispiel wäre eine Reihe von
Comparator
Implementierungen:Dieses "Muster" kann in weitaus komplexeren Szenarien verwendet werden, wobei alle mit der Aufzählung gelieferten Extras umfassend genutzt werden: Durchlaufen der Instanzen, Verlassen auf ihre implizite Reihenfolge, Abrufen einer Instanz anhand ihres Namens, statische Methoden, die die richtige Instanz bereitstellen für bestimmte Kontexte usw. Und dennoch haben Sie dies alles hinter der Benutzeroberfläche versteckt, sodass Ihr Code mit benutzerdefinierten Implementierungen ohne Änderung funktioniert, falls Sie etwas möchten, das unter den "Standardoptionen" nicht verfügbar ist.
Ich habe gesehen, dass dies erfolgreich für die Modellierung des Konzepts der Zeitgranularität (täglich, wöchentlich usw.) angewendet wurde, bei der die gesamte Logik in einer Aufzählung zusammengefasst war (Auswahl der richtigen Granularität für einen bestimmten Zeitbereich, spezifisches Verhalten, das an jede Granularität als konstant gebunden ist Methoden etc.). Und dennoch war das
Granularity
aus Sicht der Service-Schicht einfach eine Schnittstelle.quelle
CASE_INSENSITIVE { @Override public int compare(String s1, String s2) { return s1.compareToIgnoreCase(s2); }
. Ein noch nicht erwähnter Vorteil besteht darin, dass Sie eine robuste Serialisierungsunterstützung erhalten. Das persistente Formular enthält nur den Klassennamen und den Konstantennamen, unabhängig von den Implementierungsdetails Ihrer Komparatoren.Keine der anderen Antworten, die Aufzählungen besonders leistungsfähig machen, ist die Möglichkeit, Vorlagenmethoden zu verwenden . Methoden können Teil der Basisaufzählung sein und von jedem Typ überschrieben werden. Und mit dem Verhalten, das mit der Aufzählung verbunden ist, entfällt häufig die Notwendigkeit von if-else-Konstrukten oder switch-Anweisungen, wie dieser Blog-Beitrag zeigt - wo
enum.method()
wird das ausgeführt, was ursprünglich innerhalb der Bedingung ausgeführt wurde. Das gleiche Beispiel zeigt auch die Verwendung von statischen Importen mit Aufzählungen und erzeugt viel saubereren DSL-ähnlichen Code.Einige andere interessante Eigenschaften umfassen die Tatsache , dass Aufzählungen bieten Implementierung für
equals()
,toString()
undhashCode()
und implementierenSerializable
undComparable
.Für einen vollständigen Überblick über alles, was Enums zu bieten haben, empfehle ich Bruce Eckels Thinking in Java 4th Edition, die dem Thema ein ganzes Kapitel widmet. Besonders aufschlussreich sind die Beispiele für ein Spiel mit Rock, Paper, Scissors (dh RoShamBo) als Enums.
quelle
Aus Java- Dokumenten -
Ein häufiges Beispiel ist das Ersetzen einer Klasse durch eine Reihe privater statischer endgültiger int-Konstanten (innerhalb einer angemessenen Anzahl von Konstanten) durch einen Aufzählungstyp. Wenn Sie glauben, alle möglichen Werte von "etwas" zur Kompilierungszeit zu kennen, können Sie dies als Aufzählungstyp darstellen. Aufzählungen bieten Lesbarkeit und Flexibilität gegenüber einer Klasse mit Konstanten.
Einige andere Vorteile, die ich mir für Aufzählungstypen vorstellen kann. Sie sind immer eine Instanz einer bestimmten Enum-Klasse (daher kommt das Konzept, Enums als Singleton zu verwenden). Ein weiterer Vorteil ist, dass Sie Aufzählungen als Typ in der switch-case-Anweisung verwenden können. Sie können auch toString () in der Enumeration verwenden, um sie als lesbare Zeichenfolgen zu drucken.
quelle
DayOfWeek
enum ist jetzt vordefiniert, in Java 8 und höher als Teil des java.time- Frameworks integriert (und auf Java 6 & 7 und Android zurückportiert ).Sie können eine Aufzählung verwenden, um einen kleineren festen Satz von Konstanten oder einen internen Klassenmodus darzustellen und gleichzeitig die Lesbarkeit zu verbessern. Enums können auch eine bestimmte Starrheit erzwingen, wenn sie in Methodenparametern verwendet werden. Sie bieten die interessante Möglichkeit, Informationen an einen Konstruktor wie im Planets-Beispiel auf der Oracle-Site zu übergeben, und ermöglichen, wie Sie festgestellt haben, auch eine einfache Möglichkeit, ein Singleton-Muster zu erstellen.
Beispiel:
Locale.setDefault(Locale.US)
Liest besser alsLocale.setDefault(1)
und erzwingt die Verwendung des festen Wertesatzes, der in einer IDE angezeigt wird, wenn Sie das.
Trennzeichen anstelle aller Ganzzahlen hinzufügen .quelle
Enum
s Auflisten eines festen Satzes von Werten auf selbstdokumentierende Weise.Sie machen Ihren Code expliziter und weniger fehleranfällig.
Warum nicht
String
oderint
stattEnum
Konstanten verwenden?if
) schreiben , um sicherzustellen, dass Ihr Argument im gültigen Bereich liegt.String
sowieso eine ähnliche Menge an Speicher benötigen, um s zu verwenden (dies hängt von der Komplexität des abEnum
).Darüber hinaus ist jede
Enum
Instanz der Klasse eine Klasse, für die Sie ihr individuelles Verhalten definieren können.Außerdem gewährleisten sie die Thread-Sicherheit beim Erstellen der Instanzen (wenn die Aufzählung geladen wird), was bei der Vereinfachung des Singleton-Musters eine große Anwendung gefunden hat .
Dieser Blog zeigt einige seiner Anwendungen, z. B. eine Zustandsmaschine für einen Parser.
quelle
Es ist nützlich zu wissen, dass
enums
genau wie die anderen Klassen mitConstant
Feldern und aprivate constructor
.Zum Beispiel,
Der Compiler kompiliert es wie folgt;
quelle
enum
bedeutet Aufzählung, dh Erwähnung (einer Reihe von Dingen) nacheinander.ODER
Zum Beispiel:
Vorteile von Enum:
für mehr
quelle
Was ist eine Aufzählung?
Warum enum verwenden
Hinweis
quelle
Abgesehen von allem, was von anderen gesagt wurde. In einem älteren Projekt, für das ich früher gearbeitet habe, wurden bei der Kommunikation zwischen Entitäten (unabhängigen Anwendungen) ganze Zahlen verwendet, die eine kleine Menge darstellten. Es war nützlich, die Menge wie
enum
bei statischen Methoden zu deklarieren , umenum
Objekte vonvalue
und umgekehrt abzurufen. Der Code sah sauberer aus, wechselte die Benutzerfreundlichkeit der Groß- und Kleinschreibung und erleichterte das Schreiben in Protokolle.Erstellen Sie ein
enum
Objekt aus empfangenen Werten (z. B. 1,2) mitProtocolType.fromInt(2)
Write to Logs mitmyEnumObj.name
Hoffe das hilft.
quelle
Enum erbt alle Methoden der
Object
Klasse und der abstrakten KlasseEnum
. Sie können also die Methoden für Reflexion, Multithreading, Serilisierung usw. verwenden. Wenn Sie anstelle von Enum nur eine statische Konstante deklarieren, können Sie dies nicht. Außerdem kann der Wert von Enum auch an die DAO-Ebene übergeben werden.Hier ist ein Beispielprogramm zur Demonstration.
quelle
ENum steht für "Enumerated Type". Es ist ein Datentyp mit einem festen Satz von Konstanten, die Sie selbst definieren.
quelle
Meiner Meinung nach sind alle Antworten, die Sie bisher erhalten haben, gültig, aber meiner Erfahrung nach würde ich es in wenigen Worten ausdrücken:
Verwenden Sie Aufzählungen, wenn der Compiler die Gültigkeit des Werts eines Bezeichners überprüfen soll.
Andernfalls können Sie Zeichenfolgen wie immer verwenden (wahrscheinlich haben Sie einige "Konventionen" für Ihre Anwendung definiert) und Sie werden sehr flexibel sein ... aber Sie erhalten keine 100% ige Sicherheit gegen Tippfehler auf Ihren Zeichenfolgen und Sie werden sie nur realisieren zur Laufzeit.
quelle
Verwenden Sie Enums für TYPE SAFETY. Dies ist eine Sprachfunktion, die Sie normalerweise erhalten:
Aufzählungen können Methoden und Konstruktoren enthalten. Sie können sogar Aufzählungen in Aufzählungen verwenden und Aufzählungen mit Schnittstellen kombinieren.
Stellen Sie sich Enums als Typen vor, die einen genau definierten Satz von int-Konstanten ersetzen (die Java von C / C ++ 'geerbt' hat) und in einigen Fällen Bit-Flags ersetzen.
Das Buch Effective Java 2nd Edition enthält ein ganzes Kapitel und geht auf weitere Details ein. Siehe auch diesen Beitrag zum Stapelüberlauf .
quelle
Mit Java können Sie Variablen auf einen von nur wenigen vordefinierten Werten beschränken - mit anderen Worten, einen Wert aus einer Aufzählungsliste. Die Verwendung
enums
kann dazu beitragen, Fehler in Ihrem Code zu reduzieren. Hier ist ein Beispielenums
außerhalb einer Klasse:Dies beschränkt
coffeesize
auf, die entweder:BIG
,HUGE
oderOVERWHELMING
als eine Variable.quelle
Aufzählung? Warum sollte es verwendet werden? Ich denke, es ist verständlicher, wann Sie es verwenden werden. Ich habe die gleiche Erfahrung.
Angenommen, Sie haben eine Datenbankoperation zum Erstellen, Löschen, Bearbeiten und Lesen.
Wenn Sie nun eine Aufzählung als Operation erstellen:
Jetzt können Sie etwas deklarieren wie:
Sie können es also auf viele Arten verwenden. Es ist immer gut, eine Aufzählung für bestimmte Dinge zu haben, da die Datenbankoperation im obigen Beispiel durch Überprüfen der aktuellen Operation gesteuert werden kann . Vielleicht kann man sagen, dass dies auch mit Variablen und ganzzahligen Werten erreicht werden kann. Aber ich glaube, Enum ist sicherer und ein Programmierer.
Eine andere Sache: Ich denke, jeder Programmierer liebt Boolesche Werte , nicht wahr? Da nur zwei Werte gespeichert werden können, zwei spezifische Werte. Man kann sich also vorstellen, dass Enum dieselbe Art von Einrichtungen hat, in denen ein Benutzer definiert, wie viele und welche Art von Wert er speichert, nur auf etwas andere Weise. :) :)
quelle
Bisher musste ich nie Aufzählungen verwenden. Ich habe darüber gelesen, seit sie in Version 1.5 oder Version Tiger eingeführt wurden, wie es damals genannt wurde. Sie haben nie wirklich ein "Problem" für mich gelöst. Für diejenigen, die es benutzen (und ich sehe viele von ihnen), bin ich sicher, dass es definitiv einen Zweck erfüllt. Nur meine 2 Pfund.
quelle
Hier gibt es viele Antworten, ich möchte nur zwei spezifische nennen:
1) Verwendung als Konstanten in der
Switch-case
Anweisung. Mit case case können Sie keine String-Objekte für case verwenden. Aufzählungen sind praktisch. Mehr: http://www.javabeat.net/2009/02/how-to-use-enum-in-switch/2) Implementierung
Singleton Design Pattern
- Enum erneut, kommt zur Rettung. Verwendung hier: Was ist der beste Ansatz für die Verwendung einer Enum als Singleton in Java?quelle
Was mir den Ah-Ha-Moment gab, war diese Erkenntnis: dass Enum einen privaten Konstruktor hat, der nur über die öffentliche Aufzählung zugänglich ist:
quelle
Um den Code in Zukunft lesbar zu machen, wird der nützlichste anwendbare Fall der Aufzählung im nächsten Snippet dargestellt:
quelle
Nach meiner Erfahrung hat die Verwendung von Enum manchmal dazu geführt, dass es sehr schwierig ist, Systeme zu ändern. Wenn Sie eine Aufzählung für eine Reihe domänenspezifischer Werte verwenden, die sich häufig ändern, und viele andere Klassen und Komponenten davon abhängen, sollten Sie in Betracht ziehen, keine Aufzählung zu verwenden.
Zum Beispiel ein Handelssystem, das eine Aufzählung für Märkte / Börsen verwendet. Es gibt viele Märkte und es ist fast sicher, dass es viele Subsysteme geben wird, die auf diese Liste von Märkten zugreifen müssen. Jedes Mal, wenn Sie möchten, dass Ihrem System ein neuer Markt hinzugefügt wird, oder wenn Sie einen Markt entfernen möchten, muss möglicherweise alles unter der Sonne neu aufgebaut und freigegeben werden.
Ein besseres Beispiel wäre so etwas wie ein Produktkategorietyp. Angenommen, Ihre Software verwaltet das Inventar eines Kaufhauses. Es gibt viele Produktkategorien und viele Gründe, warum sich diese Liste von Kategorien ändern könnte. Manager möchten möglicherweise eine neue Produktlinie auf Lager haben, andere Produktlinien entfernen und möglicherweise die Kategorien von Zeit zu Zeit neu organisieren. Wenn Sie alle Ihre Systeme neu erstellen und erneut bereitstellen müssen, nur weil Benutzer eine Produktkategorie hinzufügen möchten, haben Sie etwas gewählt, das einfach und schnell sein sollte (Hinzufügen einer Kategorie), und es sehr schwierig und langsam gemacht.
Unterm Strich sind Aufzählungen gut, wenn die von Ihnen dargestellten Daten im Laufe der Zeit sehr statisch sind und eine begrenzte Anzahl von Abhängigkeiten aufweisen. Wenn sich die Daten jedoch stark ändern und viele Abhängigkeiten aufweisen, benötigen Sie etwas Dynamisches, das beim Kompilieren nicht überprüft wird (z. B. eine Datenbanktabelle).
quelle
Der auf Enum basierende Singleton
Dieser Ansatz implementiert den Singleton, indem er die Garantie von Java nutzt, dass ein Enum-Wert in einem Java-Programm nur einmal instanziiert wird und Enum implizite Unterstützung für die Thread-Sicherheit bietet. Da auf Java-Enum-Werte global zugegriffen werden kann, kann sie als Singleton verwendet werden.
Wie funktioniert das? Nun, die zweite Zeile des Codes kann wie folgt betrachtet werden:
Und wir bekommen einen guten alten, früh initialisierten Singleton.
Denken Sie daran, dass Sie, da dies eine Aufzählung ist, immer auch über auf die Instanz zugreifen können
VorteileSingleton.INSTANCE
:valueOf
Methode mit dem deserialisierten Namen verwendet, um die gewünschte Instanz zu erhalten.Enum
Klasse. Der Grund dafür, dass Reflektion nicht zum Instanziieren von Objekten vom Aufzählungstyp verwendet werden kann, liegt darin, dass die Java-Spezifikation dies nicht zulässt und diese Regel in der Implementierung dernewInstance
Methode derConstructor
Klasse codiert ist , die normalerweise zum Erstellen von Objekten über Reflektion verwendet wird:map
. Anstatt eine einzelne Instanz pro Anwendung (z. B. diejava.lang.Runtime
) zu haben, stellt das Multiton-Muster stattdessen eine einzelne Instanz pro Schlüssel sicher .Es gibt mehrere Realisierungen von Singleton-Mustern mit jeweils Vor- und Nachteilen.
Detaillierte Beschreibung Jeder von ihnen ist zu ausführlich, deshalb habe ich nur einen Link zu einem guten Artikel eingefügt - Alles, was Sie über Singleton wissen wollen
quelle
Ich würde Enums als nützliches Mapping-Instrument verwenden und mehrere vermeiden,
if-else
vorausgesetzt, einige Methoden sind implementiert.Mit dieser Methode
by(String label)
können Sie den Aufzählungswert also durch Nichtaufzählung abrufen. Ferner kann man eine Zuordnung zwischen 2 Aufzählungen erfinden. Könnte auch '1 zu viele' oder 'viele zu viele' zusätzlich zu 'eins zu eins' Standardbeziehung versuchenAm Ende
enum
ist eine Java-Klasse. Sie können also einemain
Methode darin haben, die nützlich sein kann, wenn Sie einige Zuordnungsvorgängeargs
sofort ausführen müssen .quelle
Anstatt eine Reihe von const int-Deklarationen abzugeben
Sie können sie alle in einer Aufzählung gruppieren
Es ist also alles von der gemeinsamen Gruppe organisiert, zu der sie gehören
quelle
Aufzählungen sind wie Klassen. Wie die Klasse hat es auch Methoden und Attribute.
Unterschiede zur Klasse sind: 1. Enum-Konstanten sind öffentlich, statisch, endgültig. 2. Eine Aufzählung kann nicht zum Erstellen eines Objekts verwendet werden und kann keine anderen Klassen erweitern. Es können jedoch Schnittstellen implementiert werden.
quelle
Zusätzlich zu @BradB Antwort:
Das ist so wahr ... Es ist seltsam, dass es die einzige Antwort ist, die das erwähnt. Wenn Anfänger Enums entdecken, nehmen sie dies schnell als Zaubertrick für die Überprüfung gültiger Bezeichner für den Compiler. Und wenn der Code auf verteilten Systemen verwendet werden soll, weinen sie ... einige Monate später. Die Aufrechterhaltung der Abwärtskompatibilität mit Aufzählungen, die eine nicht statische Werteliste enthalten, ist ein echtes Problem und schmerzhaft. Dies liegt daran, dass sich beim Hinzufügen eines Werts zu einer vorhandenen Aufzählung der Typ ändert (trotz des Namens nicht).
"Ho, warte, es könnte wie der gleiche Typ aussehen, oder? Immerhin handelt es sich um Aufzählungen mit demselben Namen - und sind Aufzählungen nicht nur ganze Zahlen unter der Haube?" Aus diesen Gründen wird Ihr Compiler wahrscheinlich nicht die Verwendung einer Definition des Typs selbst kennzeichnen, bei dem er die andere erwartet hat. Tatsächlich handelt es sich jedoch (in den wichtigsten Punkten) um verschiedene Typen. Am wichtigsten ist, dass sie unterschiedliche Datendomänen haben - Werte, die je nach Typ akzeptabel sind. Durch Hinzufügen eines Werts haben wir den Typ der Aufzählung effektiv geändert und damit die Abwärtskompatibilität unterbrochen.
Fazit: Verwenden Sie es, wenn Sie möchten, überprüfen Sie jedoch, ob es sich bei der verwendeten Datendomäne um eine endliche, bereits bekannte, feste Menge handelt .
quelle