Enum とそのすべての機能 - 1

「こんにちは、アミーゴ!」

「こんにちは、アミーゴ!」

「非常に興味深いことについてお話します。非常に単純ですが、それがさらに興味深いものになります。これは列挙型と呼ばれます。列挙型は、変数が持つことができる特定の値のセットを定義する型です。見てみましょう。すぐに例を挙げます:」

enum クラスの定義
public enum Direction
{
 UP,
 DOWN,
 LEFT,
 RIGHT,
}
列挙型の使用
Direction direction = Direction.LEFT;

if (direction == Direction.LEFT)
 direction = Direction.RIGHT;
else
 direction = Direction.DOWN;

「では、一連の値を列挙するだけで、それだけなのでしょうか?」

「はい、列挙型を宣言し、その中に含まれるすべての可能な値をカンマで区切ってリストします。」

使い方もとても簡単です。

「nullに設定できますか?」

「はい、enum は通常のクラスです。むしろ、インターフェイスがクラスに似ているのと同じように、クラスのようなものです。」

「では、クラスを使用できる場合はどこでも enum を使用できますか?」

"はい。"

「クラス内で列挙型を宣言できますか?」

"はい。"

「そして列挙型を継承しますか?」

「いいえ、列挙型を継承することはできません。列挙型は他のクラスを継承することもできません。」

"何故ですか?"

「Java コンパイラは列挙型を次のように変換するためです。

public final class Direction extends Enum
{
 public static final Direction UP = new Direction();
 public static final Direction DOWN = new Direction();
 public static final Direction LEFT = new Direction();
 public static final Direction RIGHT = new Direction();

 private Direction() {} // Private constructor
}

「この例からわかるように:」

1) Direction クラスは Enum クラスを絶対に継承するため、他のものを継承することはできません。

2) Direction クラスはfinalとして宣言されているため、他のものはそれを継承できません。

3) Direction クラスの変数は、実際にはパブリックな静的な最終 Direction 変数です。これは、それらを使用するコードで明らかです。

方向方向 =方向.LEFT ;

4) Direction クラスにはコンストラクターが 1 つだけ含まれており、プライベートです。つまり、Direction オブジェクトはクラス内のコードを使用してのみ作成できるということです。宣言されたオブジェクト以外のオブジェクトは作成できません。

5)方向変数には、既存の任意の Direction オブジェクトへの参照を割り当てることができます。これらはすべて列挙型内で設定されます。このタイプのオブジェクトは他に存在せず、将来も存在しません。

6)方向オブジェクトは«==»を使用して比較できます。これは単純な参照比較を実行するだけです。」

「それが非常に明確であるとは言えませんが、あなたの例の後では、より明確になります。」

「わかりました。それでは、もう少し詳しい情報をご紹介します。」

1)各方向オブジェクトには独自の固有の番号があります。最初 (UP) は 0、2 番目 (DOWN) は 1、3 番目 (LEFT) は 2 などです。この数値は ordinal() メソッドを使用して取得できます。「画面を見てください。

Direction direction = Direction.LEFT;
int index = direction.ordinal();
int index2 = Direction.RIGHT.ordinal();

2)各列挙型には、列挙型の値の配列を返すvalue () メソッドがあります。

int leftIndex = Direction.LEFT.ordinal();

Direction[] array = Direction.values();
Direction left = array[leftIndex];

「これは、任意の enum 要素のインデックスを取得し、そのインデックスを使用して要素を再度取得できることを意味します。」

「 foreachループで列挙型を使用することもできます。」

for (Direction direction : Direction.values())
{
 System.out.println(direction);
}
画面出力:
UP
DOWN
LEFT
RIGHT

「それは、enum が toString メソッドをオーバーライドするという意味ですか? 結局のところ、次のようなものは表示されません。」
«com.codegym.Direction@123fd4»?

「はい。さらに、各列挙型、つまり方向は文字列に変換でき、その逆も可能です。」

文字列に変換します。
String left = Direction.LEFT.toString(); // left == "LEFT";
文字列を列挙型に変換します。
Direction direction = Direction.valueOf("LEFT");

「ああ、分かった。」

「Direction にない valueOf 関数に String を渡した場合はどうなりますか? たとえば、«AMIGO»?」

"どう思いますか?"

"例外?"

「はい。IllegalArgumentException です。」

「さて、これで enum の世界への紹介は終わりです。」