Fornire un'implementazione predefinita di compareTo che utilizza l'ordinamento del codice sorgente va bene; renderlo definitivo è stato un passo falso da parte di Sun. L'ordinale rappresenta già l'ordine di dichiarazione. Sono d'accordo che nella maggior parte delle situazioni uno sviluppatore può semplicemente ordinare logicamente i propri elementi, ma a volte si vuole che il codice sorgente sia organizzato in modo da rendere la leggibilità e la manutenzione fondamentali. Per esempio:
//===== SI BYTES (10^n) =====//
/** 1,000 bytes. */ KILOBYTE (false, true, 3, "kB"),
/** 106 bytes. */ MEGABYTE (false, true, 6, "MB"),
/** 109 bytes. */ GIGABYTE (false, true, 9, "GB"),
/** 1012 bytes. */ TERABYTE (false, true, 12, "TB"),
/** 1015 bytes. */ PETABYTE (false, true, 15, "PB"),
/** 1018 bytes. */ EXABYTE (false, true, 18, "EB"),
/** 1021 bytes. */ ZETTABYTE(false, true, 21, "ZB"),
/** 1024 bytes. */ YOTTABYTE(false, true, 24, "YB"),
//===== IEC BYTES (2^n) =====//
/** 1,024 bytes. */ KIBIBYTE(false, false, 10, "KiB"),
/** 220 bytes. */ MEBIBYTE(false, false, 20, "MiB"),
/** 230 bytes. */ GIBIBYTE(false, false, 30, "GiB"),
/** 240 bytes. */ TEBIBYTE(false, false, 40, "TiB"),
/** 250 bytes. */ PEBIBYTE(false, false, 50, "PiB"),
/** 260 bytes. */ EXBIBYTE(false, false, 60, "EiB"),
/** 270 bytes. */ ZEBIBYTE(false, false, 70, "ZiB"),
/** 280 bytes. */ YOBIBYTE(false, false, 80, "YiB");
È possibile che questo ordinamento guarda bene nel codice sorgente, ma non è come l'autore ritiene che il compareTo dovrebbe funzionare. Il paragone desiderato per il comportamento è avere un ordinamento in base al numero di byte. L'ordinamento del codice sorgente che farebbe accadere ciò degraderebbe l'organizzazione del codice.
Come cliente di un'enumerazione non mi importava meno come l'autore ha organizzato il proprio codice sorgente. Voglio però che il loro algoritmo di confronto abbia un qualche senso, comunque. Sun ha inutilmente messo i writer del codice sorgente in un vincolo.
I comparatori personalizzati sono efficaci solo quando si fornisce l'Enum a una raccolta. Non aiuta tanto se vuoi fare un confronto diretto. –
Sì, lo fa. nuovo MyEnumComparator.compare (enum1, enum2). Et voilà. – Bombe
@martinoconnor & Bombe: ho inserito i tuoi commenti nella risposta. Grazie! –