JavaのEnumとcompareToメソッドを完全ガイド!初心者でもわかるjava.langパッケージの基礎
生徒
「先生、Javaのenumで順番を比べる方法ってあるんですか?」
先生
「はい、java.lang.EnumクラスにはcompareToメソッドが用意されていて、定義した順番を使って比較できますよ。」
生徒
「じゃあ、曜日や色みたいに複数の定数を定義した場合に順序を調べることができるんですね?」
先生
「その通りです。実際にどう動くのか、これから一緒に見ていきましょう!」
1. java.langパッケージとは?
Javaのjava.langパッケージは、Javaプログラムに自動的にインポートされる基本的なパッケージです。文字列を扱うStringクラス、数学計算を行うMathクラス、そして列挙型をサポートするEnumクラスなどが含まれています。特にEnumは定数をひとまとめに管理できるため、初心者でも理解しやすく、コードの品質を高めることができます。
2. Enumクラスの基本
EnumはJavaの列挙型を表現するための抽象クラスで、すべての列挙型は暗黙的にjava.lang.Enumを継承しています。例えば曜日を表す列挙型は以下のように書けます。
enum Day {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}
このように定義することで、定数の誤入力を防ぎ、プログラムの可読性を大きく向上させられます。
将来を見据えて、+αのスキルを身につけたい方へ
JavaやLinuxを学んでいても、「このままで市場価値は上がるのか」 「キャリアの選択肢を広げたい」と感じる方は少なくありません。
AIを学ぶならアイデミープレミアム3. compareToメソッドとは?
compareToメソッドは、列挙型の定数同士を定義順に基づいて比較するためのメソッドです。戻り値は整数で、次のような意味を持ちます。
- 0:二つの定数が同じ位置である
- 正の値:呼び出し元が引数より後に定義されている
- 負の値:呼び出し元が引数より前に定義されている
4. compareToの基本的な使い方
具体的に曜日の列挙型を使って、compareToの挙動を確認してみましょう。
public class EnumCompareExample {
public static void main(String[] args) {
Day d1 = Day.MONDAY;
Day d2 = Day.WEDNESDAY;
Day d3 = Day.MONDAY;
System.out.println(d1.compareTo(d2)); // 負の値
System.out.println(d2.compareTo(d1)); // 正の値
System.out.println(d1.compareTo(d3)); // 0
}
}
-2
2
0
この結果からもわかるように、列挙型は定義した順序に従って比較されるため、自然な順番で並び替えや条件判定を行うことができます。
5. compareToを利用した並び替え
compareToはソート処理でも大活躍します。例えば、色を表す列挙型を定義して並び替えると、定義順に並ぶことが確認できます。
enum Color {
RED, GREEN, BLUE, YELLOW
}
import java.util.*;
public class SortEnumExample {
public static void main(String[] args) {
List<Color> colors = new ArrayList<>();
colors.add(Color.YELLOW);
colors.add(Color.RED);
colors.add(Color.BLUE);
Collections.sort(colors);
for (Color c : colors) {
System.out.println(c);
}
}
}
RED
BLUE
YELLOW
このように、定義順序を利用して自然な並び替えが実現できるため、リストや配列の操作で役立ちます。
6. compareToの注意点
compareToは列挙型の定義順に基づいて動作するため、実際の意味的な大小関係を表すわけではありません。例えば、曜日を比較しても「金曜日が月曜日より大きい」とは人間的な意味では言えませんが、定義上の順番としては後にあるので正の値が返ります。
もし意味的な大小比較が必要な場合は、別途フィールドを持たせて比較処理を自作する必要があります。
7. 応用:独自の比較ロジックを実装する
列挙型に独自の数値フィールドを持たせることで、compareTo以外の基準で比較することも可能です。例えば、曜日に番号を割り当てて、任意の順序で比較する例を示します。
enum Weekday {
MONDAY(1), TUESDAY(2), WEDNESDAY(3), THURSDAY(4),
FRIDAY(5), SATURDAY(6), SUNDAY(7);
private final int order;
Weekday(int order) {
this.order = order;
}
public int getOrder() {
return order;
}
}
public class CustomCompareExample {
public static void main(String[] args) {
Weekday w1 = Weekday.FRIDAY;
Weekday w2 = Weekday.MONDAY;
System.out.println(Integer.compare(w1.getOrder(), w2.getOrder()));
}
}
4
このように独自の比較基準を用意することで、より柔軟に列挙型を活用できます。
8. 押さえておきたいポイント
Javaのjava.lang.Enumクラスに用意されているcompareToメソッドは、列挙型を順序付きで扱うために非常に便利です。ソートや条件分岐に使えるだけでなく、プログラム全体の一貫性を保つためにも役立ちます。初心者のうちは定義順に基づく比較で十分ですが、慣れてきたら独自のロジックを追加する応用方法も試してみると理解が深まります。
Java Silver SE17(1Z0-825)の演習量を重視したい人には、 定番の問題集がこちらです。
徹底攻略 Java SE 17 Silver 問題集をAmazonで見る※ Amazonアソシエイト・プログラムを利用しています