Eine Aufzählung in Java implementiert die Comparable
Schnittstelle. Es wäre schön außer Kraft zu setzen gewesen Comparable
‚s compareTo
Methode, aber hier ist es als final markiert. Der Standard natürliche Ordnung auf Enum
‚s compareTo
ist die angegebene Reihenfolge.
Weiß jemand, warum eine Java-Aufzählung diese Einschränkung hat?
java
enums
comparable
compareto
neu242
quelle
quelle
Antworten:
Aus Gründen der Konsistenz denke ich ... wenn Sie einen
enum
Typ sehen, wissen Sie sicher , dass seine natürliche Reihenfolge die Reihenfolge ist, in der die Konstanten deklariert werden.Um dies zu umgehen, können Sie ganz einfach Ihre eigenen erstellen
Comparator<MyEnum>
und verwenden, wenn Sie eine andere Bestellung benötigen:Sie können das
Comparator
direkt verwenden:oder verwenden Sie es in Sammlungen oder Arrays:
Weitere Informationen:
quelle
MyEnumComparator
es keinen Status hat, sollte es nur ein Singleton sein, insbesondere wenn Sie das tun, was @Bombe vorschlägt. Stattdessen würden Sie so etwas wieMyEnumComparator.INSTANCE.compare(enum1, enum2)
unnötige Objekterstellung vermeidenLENGTH_COMPARATOR
statischen Feld in der Aufzählung gespeichert werden . Auf diese Weise wäre es für jeden, der die Aufzählung verwendet, leicht zu finden.Es ist in Ordnung, eine Standardimplementierung von compareTo bereitzustellen, die die Quellcode-Reihenfolge verwendet. es endgültig zu machen war ein Fehltritt von Suns Seite. Die Ordnungszahl berücksichtigt bereits die Deklarationsreihenfolge. Ich bin damit einverstanden, dass ein Entwickler in den meisten Situationen seine Elemente nur logisch ordnen kann, aber manchmal möchte man, dass der Quellcode so organisiert ist, dass Lesbarkeit und Wartung an erster Stelle stehen. Beispielsweise:
Die obige Reihenfolge sieht im Quellcode gut aus, aber der Autor ist nicht der Meinung, dass compareTo funktionieren sollte. Das gewünschte compareTo-Verhalten besteht darin, dass die Reihenfolge nach Anzahl der Bytes erfolgt. Die Reihenfolge des Quellcodes, die dies bewirken würde, verschlechtert die Organisation des Codes.
Als Kunde einer Aufzählung ist es mir egal, wie der Autor seinen Quellcode organisiert hat. Ich möchte jedoch, dass ihr Vergleichsalgorithmus einen Sinn ergibt. Sun hat Quellcode-Schreiber unnötigerweise in eine Bindung gebracht.
quelle
Aufzählungswerte werden logisch genau in der Reihenfolge sortiert, in der sie deklariert sind. Dies ist Teil der Java-Sprachspezifikation. Daraus folgt, dass Aufzählungswerte nur verglichen werden können, wenn sie Mitglieder derselben Aufzählung sind. Die Spezifikation möchte ferner sicherstellen, dass die von compareTo () zurückgegebene vergleichbare Reihenfolge mit der Reihenfolge übereinstimmt, in der die Werte deklariert wurden. Dies ist die Definition einer Aufzählung.
quelle
Eine mögliche Erklärung ist, dass
compareTo
mit übereinstimmen sollteequals
.Und
equals
für Aufzählungen sollte mit Identitätsgleichheit übereinstimmen (==
).Wenn
compareTo
es nicht endgültig ist, kann es mit einem Verhalten überschrieben werden, das nicht mitequals
dem übereinstimmt , was sehr kontraintuitiv wäre.quelle
Wenn Sie die natürliche Reihenfolge der Elemente Ihrer Aufzählung ändern möchten, ändern Sie deren Reihenfolge im Quellcode.
quelle