なぜcompareToに列挙型の最終Java?
-
21-08-2019 - |
質問
Enum Javaを実装する Comparable
インタフェース。いてもオーバーライド Comparable
's compareTo
方法が、ここでは、最終的なものとする。デフォルトの自然順 Enum
's compareTo
でください。
なんだろうけど、日本人はなぜJava enumsてこの制限?
解決
一貫性のた思...して対処してください enum
タイプん のための実 その自然順序付けは、定数は宣言しています。
を回避策ることで、容易に作成 Comparator<MyEnum>
使用すると、必要な時にいつでも別の秩序:
enum MyEnum
{
DOG("woof"),
CAT("meow");
String sound;
MyEnum(String s) { sound = s; }
}
class MyEnumComparator implements Comparator<MyEnum>
{
public int compare(MyEnum o1, MyEnum o2)
{
return -o1.compareTo(o2); // this flips the order
return o1.sound.length() - o2.sound.length(); // this compares length
}
}
で利用できます Comparator
直接:
MyEnumComparator c = new MyEnumComparator();
int order = c.compare(MyEnum.CAT, MyEnum.DOG);
ご使用メントシステム開発を支配列:
NavigableSet<MyEnum> set = new TreeSet<MyEnum>(c);
MyEnum[] array = MyEnum.values();
Arrays.sort(array, c);
さらに情報:
他のヒント
ソースコードの順序が細かい使用するのcompareToのデフォルトの実装を提供します。それは最終的作ることはSunの一部に失策でした。序数は、すでに宣言順を占めています。私は、ほとんどの状況では、開発者だけで論理的にその要素を注文することができますことに同意し、時には1は、読みやすさとメンテナンスが重要であることを作る方法で編成ソースコードを望んでいます。たとえばます:
//===== 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");
上記の順序は、ソースコードによさそうだが、著者はのcompareToは動作するはずと考えているかではありません。希望のcompareToの動作は、バイト数であることを注文していることです。それが起こるになるだろう、ソースコードの順序は、コードの組織を劣化させます。
私は、著者が自分のソースコードを整理する方法あまり気にしませんでした列挙のクライアントとして。でも、私は彼らの比較アルゴリズムは、感覚のいくつかの種類を作りたいん。 Sunは不必要にバインドしてソースコードの作者を入れています。
列挙値を正確に宣言されている順序に従って、論理的に順序付けられています。これは、Java言語仕様の一部です。したがって、それらは同一の列挙型のメンバーである場合列挙値のみを比較することができることになります。仕様は、さらにのcompareTo()によって返される同等の順に値が宣言された順序と同じであることを保証したいと考えています。これは、列挙の定義そのものです。
この説明は compareTo
と整合するべきである equals
.
や equals
のためのenumsと整合するべきであるアイデンティティの平等(==
).
の場合 compareTo
が行うことができるものとします。終ることは可能でオーバーライドで行ったのと一致しないこと equals
, をカウンター-直観的です。
あなたが列挙型の要素の自然順序を変更したい場合は、ソースコードで自分の順番を変更します。