Um enum em Java implementa a Comparable
interface. Teria sido bom substituir Comparable
o compareTo
método de, mas aqui está marcado como final. A ordem natural padrão em Enum
's compareTo
é a ordem listada.
Alguém sabe por que enums Java tem essa restrição?
java
enums
comparable
compareto
neu242
fonte
fonte
Respostas:
Por consistência, eu acho ... quando você vê um
enum
tipo, sabe com certeza que sua ordem natural é a ordem em que as constantes são declaradas.Para contornar isso, você pode criar facilmente o seu próprio
Comparator<MyEnum>
e usá-lo sempre que precisar de um pedido diferente:Você pode usar
Comparator
diretamente:ou usá-lo em coleções ou arrays:
Outras informações:
fonte
MyEnumComparator
não tem estado, deve ser apenas um singleton, especialmente se você estiver fazendo o que @Bombe sugere; em vez disso, você faria algo comoMyEnumComparator.INSTANCE.compare(enum1, enum2)
evitar a criação desnecessária de objetosLENGTH_COMPARATOR
campo estático no enum. Dessa forma, seria fácil localizar para qualquer pessoa que esteja usando o enum.Fornecer uma implementação padrão de compareTo que usa a ordem do código-fonte está bom; torná-lo final foi um erro da parte da Sun. O ordinal já responde pela ordem de declaração. Eu concordo que na maioria das situações um desenvolvedor pode apenas ordenar logicamente seus elementos, mas às vezes alguém quer o código-fonte organizado de uma maneira que torne a legibilidade e a manutenção fundamentais. Por exemplo:
A ordem acima parece boa no código-fonte, mas não é como o autor acredita que compareTo deve funcionar. O comportamento desejado compareTo é ter a ordenação por número de bytes. A ordem do código-fonte que faria isso acontecer degrada a organização do código.
Como cliente de uma enumeração, não poderia me importar menos como o autor organizou seu código-fonte. Eu quero que seu algoritmo de comparação faça algum sentido, no entanto. A Sun colocou desnecessariamente os escritores de código-fonte em um beco sem saída.
fonte
Os valores de enumeração são precisamente ordenados logicamente de acordo com a ordem em que são declarados. Isso faz parte da especificação da linguagem Java. Portanto, segue-se que os valores de enumeração só podem ser comparados se forem membros do mesmo Enum. A especificação deseja garantir ainda mais que a ordem comparável retornada por compareTo () seja a mesma na qual os valores foram declarados. Esta é a própria definição de enumeração.
fonte
Uma explicação possível é que
compareTo
deve ser consistente comequals
.E
equals
para enums deve ser consistente com a igualdade de identidade (==
).Se
compareTo
fosse não final, seria possível substituí-lo por um comportamento que não era consistente comequals
, o que seria muito contra-intuitivo.fonte
Se você quiser alterar a ordem natural dos elementos de seu enum, altere sua ordem no código-fonte.
fonte