Ist es gute Praxis zu verwenden Ordinalzahl der enum?
Habe ich enum:
public enum Persons {
CHILD,
PARENT,
GRANDPARENT;
}
Gibt es irgendwelche Probleme mit der Verwendung von ordinal()
Methode zu überprüfen, "Hierarchie" zwischen enum-Mitglieder? Ich meine - gibt es irgendwelche Nachteile, wenn Sie es ohne Weitschweifigkeit, wenn Sie jemand ändern kann, versehen, um in der Zukunft.
Oder ist es besser, etwas zu tun:
public enum Persons {
CHILD(0),
PARENT(1),
GRANDPARENT(2);
private Integer hierarchy;
private Persons(final Integer hierarchy) {
this.hierarchy = hierarchy;
}
public Integer getHierarchy() {
return hierarchy;
}
}
Sie selbst müssen einen numerischen Wert? Enum-Werte können miteinander verglichen werden direkt. Zum Beispiel
"Die Ordinalzahl der enum"? Das wäre enumth.
Menschen, die diese Art von Sache, die eine Menge, aber es code macht die Pflege schwieriger.
Vielleicht es ist nicht ein job für enum an alle.
Es gibt keinen Grund zu verwenden
if (Persons.CHILD.compareTo(Persons.PARENT) < 0) System.out.println("CHILD has a smaller value than PARENT.");
"Die Ordinalzahl der enum"? Das wäre enumth.
Menschen, die diese Art von Sache, die eine Menge, aber es code macht die Pflege schwieriger.
Vielleicht es ist nicht ein job für enum an alle.
Es gibt keinen Grund zu verwenden
Integer
Objekte anstelle von int
Werte hier.InformationsquelleAutor ByeBye | 2017-06-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie beziehen sich auf die javadoc für
ordinal
Methode inEnum.java
:Erstens - Lesen Sie das Handbuch (javadoc in diesem Fall).
Zweitens -, schreiben Sie nicht spröde code. Der enum-Werte kann sich in Zukunft ändern, und der zweite code-Beispiel ist viel mehr klar und wartbar.
Sie definitiv nicht wollen, um Probleme zu schaffen für die Zukunft, wenn ein neuer enum-Wert ist (sagen) eingefügt zwischen
PARENT
undGRANDPARENT
.Es kann nicht sein, die meisten wartbar, aber es ist deutlich besser als mit Ihrem Verhalten hängt von der Reihenfolge, in der Sie geschehen, haben erklärt, Ihre enum-Werte.
denn das einzige, was weniger wartbar ist der code, dass wird brechen, wenn jemand änderungen es in die falsche Richtung, und das fügt nichts zu erklären, diese Tatsache. Aber persönlich würde ich die erste Methode verwenden, und hinzufügen eines Kommentars zu erklären, dass, um Dinge...
und eine Reihe von tests, die fehlschlagen wird, wenn jemand, ignoriert den Kommentar und ändert die Reihenfolge. Wenn Sie in der unglücklichen Lage, dass wir ein team, wo unit-tests werden nicht ausgeführt oder Fehler werden oftmals ignoriert und die Umsetzung, die explizit zahlen Sie ist viel sicherer.
Viele Dinge hängen von der Reihenfolge, in der Sie geschehen, haben erklärt, Ihre enum-Werte, einschließlich
compareTo()
, diefinal
. Um sinnvoll für Java-enums. Wenn Sie wollen, dass es nicht sinnvoll sein, Sie sollten schreiben Sie Ihre eigenen enum-wie Klasse Sie mit Ihren eigenen Bestellung Regeln.InformationsquelleAutor vikingsteve
Der erste Weg ist nicht gerade verständlich als Sie haben, den code zu Lesen, wo die enums verwendet werden, um zu verstehen, dass die Reihenfolge der enum-Angelegenheiten.
Es ist sehr fehleranfällig.
Der zweite Weg ist besser, als es ist selbsterklärend :
Natürlich, den Befehlen des enum-Werte sollten im Einklang mit der hierarchischen Ordnung durch den enum Konstruktor Argumente.
Es stellt eine Art von Redundanz, da sowohl die enum-Werte und die Argumente der enum-Konstruktor vermittelt die Hierarchie von Ihnen.
Aber warum sollte es ein problem sein ?
Enums sind die Darstellung von Konstanten und nicht Häufig wechselnde Werte.
Die OP enum-Nutzung zeigt auch eine gute enum-Verwendung :
Enums sind nicht entworfen, um Werte darzustellen, die Häufig bewegt.
In diesem Fall, mit enums ist wahrscheinlich nicht die beste Wahl, da es möglicherweise bricht oft der client-code, der es verwendet und außerdem ist es die Kräfte neu zu kompilieren, Verpacken und bereitstellen der Anwendung zu jeder Zeit einen enum-Wert verändert wird.
Außer der zweite Weg ist nicht wirklich selbsterklärend.
Davies, Sie beziehen sich auf
hierarchy
Feld name kann irreführend sein ?InformationsquelleAutor davidxxx
Ersten, werden Sie wahrscheinlich brauchen noch nicht einmal eine numerische Ordnung Wert -- das ist
was
Vergleichbar
ist für, und
Enum<E>
implementiertComparable<E>
.Wenn Sie tun müssen einen numerischen Wert, um für einige Grund, ja, Sie sollten
verwenden
ordinal()
. Das ist, was es ist.Standard practice for Java
Enums
ist, nach dem die Sortierung in der Reihenfolge der Deklaration,das ist der Grund, warum
Enum<E>
implementiertComparable<E>
und warumEnum.compareTo()
istfinal
.Wenn Sie fügen Sie Ihre eigenen nicht-standard-Vergleich-code, der nicht
Comparable
und hängt nicht von der Reihenfolge der Deklaration, die Sie geradegehen Sie zu verwirren sonst jemand, der versucht, Ihren code, einschließlich
Ihre eigene Zukunft selbst. Niemand wird erwarten, dass code vorhanden ist;
Sie gehen zu erwarten, dass
Enum
zuEnum
.Wenn die benutzerdefinierte Reihenfolge entspricht nicht der Reihenfolge der Deklaration, wer
Blick auf die Erklärung geht zu verwechseln. Wenn es hat
(geschehen, in diesem moment) entsprechen der Reihenfolge der Deklaration, wer
schauen, Sie ist gekommen, um zu erwarten, dass, und Sie gehen zu
Holen Sie sich einen fiesen Schock, wenn irgendwann in der Zukunft gibt es nicht. (Wenn Sie schreiben
code (oder tests), um gewährleisten, dass die benutzerdefinierte Reihenfolge entspricht der
in der Reihenfolge der Deklaration, Sie sind nur verstärkende, wie unnötig es ist.)
Wenn Sie Ihre eigenen hinzufügen, um den Wert, den Sie erstellen Wartungs-Kopfschmerzen
für sich selbst:
hierarchy
Werte sind einzigartignachfolgende Werte
Wenn Sie befürchten, jemand könnte die Reihenfolge ändern, versehentlich in der
Zukunft, Schreibe einen unit test, der überprüft die Bestellung.
In der Summe, in den unsterblichen Worten von Artikel 47:
kennen und nutzen die Bibliotheken.
P. S. Auch, verwenden Sie nicht
Integer
wenn du meinstint
. ?Ja, aber das ist nicht das, was der OP gefragt.
Um fair zu sein, es war unklar, was OP machen wollte mit 'Hierarchie'.
Es ist kein besonders gut geschriebenes Frage, aber die verwenden nur ausdrücklich spricht, ist, um, und das Beispiel genau Festplatte-codes die gleichen Werte
ordinal()
geben würde.Muttermale. Danke. Eine Stimme der Vernunft in einem Meer von widerlich und kontraproduktiv lore . Man Kämpfe immer mit der Art der Beratung, die gegeben ist in dieser Frage. Ich verbrachte zwei Tage grübelte darüber nach, und kam schließlich zu dem gleichen Schluss, Sie haben. Und war auf meinem Weg zurück zu schreiben, ein argument gegen die Verwendung von enum-Felder, in diesem Fall, wenn ich Ihre post. Wenn nur würd ich bemerkte es vor zwei Tagen.
InformationsquelleAutor David Moles
Vorgeschlagen von Joshua Bloch in Effektive Java -, es ist nicht eine gute Idee, um daraus einen Wert mit einem zugeordneten enum-von Ihrer Ordnungszahl, da änderungen an der Reihenfolge der enum-Werte kann die Logik, die Sie codiert.
Den zweiten Ansatz, den Sie erwähnen, folgt genau das, was der Autor schlägt vor, die speichern den Wert in einem separaten Feld.
Ich würde sagen, dass die alternative, die Sie vorgeschlagen, ist auf jeden Fall besser, weil es mehr erweiterbar und wartbar, da Sie die Entkopplung der Reihenfolge der enum-Werte und der Begriff der Hierarchie.
InformationsquelleAutor msf1013
Mit
ordinal()
ist unrecommended Veränderungen in der enum-Deklaration können Auswirkungen auf die ordinale Werte.UPDATE:
Es ist erwähnenswert, dass die enum-Felder sind Konstanten und können dupliziert haben Werte, d.h.
Je nachdem, was Sie planen zu tun, mit
hierarchy
dies kann entweder schädlich oder nützlich ist.Darüber hinaus können Sie die Verwendung der enum-Konstanten zu erstellen Sie Ihre eigenen
EnumFlags
anstattEnumSet
zum BeispielInformationsquelleAutor Leonardo Pina
Wenn Sie nur wollen, um Beziehungen zwischen enum-Werte, die Sie tatsächlich nutzen können, der trick mit anderen enum-Werte:
Beachten Sie, dass Sie nur verwenden können, enum-Werte deklariert wurden, lexikalisch, bevor Sie versuchen zu erklären, so funktioniert dies nur, wenn Ihre Beziehungen bilden einen azyklischen gerichteten Graphen (und der Bestellung erklären Sie Ihnen eine gültige topologische Sortierung).
InformationsquelleAutor Daniel Pryden
Ich würde die zweite option (unter Verwendung einer expliziten integer), so dass die numerischen Werte zugeordnet von Ihnen und nicht von Java.
InformationsquelleAutor gpeche
Nach java doc
Können Sie Steuern, die Ordnungszahl durch das ändern der Reihenfolge der enum, aber nicht explizit.Eine Problemumgehung ist, um eine zusätzliche Methode im enum für die Nummer, die Sie möchten.
In dieser situation
Samsung.ordinal() = 0
, aberSamsung.getVal() = 400
.InformationsquelleAutor gati sahu
Dies ist keine direkte Antwort auf deine Frage. Eher bessere Konzept für Ihren Anwendungsfall. Auf diese Weise stellt sicher, dass der nächste Entwickler wird explizit wissen, dass die Werte für Eigenschaften, die nicht geändert werden sollte.
Erstellen Sie eine Klasse mit statischen Eigenschaften, die simuliert enum:
Dann genauso verwenden wie enum:
Wird es für die meisten einfachen Anwendungsfälle. Sonst könnten Sie fehlen auf Optionen wie valueOf(), EnumSet, EnumMap oder Werte().
InformationsquelleAutor mzmrk