枚舉及其所有功能 - 1

“嗨,阿米戈!”

“嗨,阿米戈!”

“我要告訴你一些非常有趣的事情。它很簡單,但這使它更有趣。它稱為枚舉。枚舉是一種定義變量可以具有的特定值集的類型。讓我們看一下舉個例子:“

枚舉類的定義
public enum Direction
{
 UP,
 DOWN,
 LEFT,
 RIGHT,
}
使用枚舉
Direction direction = Direction.LEFT;

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

“所以我們只列出一組值,僅此而已?”

“是的,我們聲明一個枚舉並在裡面列出它所有可能的值,用逗號分隔。”

“它也很容易使用。”

“你能把它設為空嗎?”

“是的,枚舉是一個常規類,或者更確切地說,它有點像類,類似於接口與類的相似之處。”

“所以無論我在哪裡可以使用類,我都可以使用枚舉嗎?”

“是的。”

“我可以在類中聲明一個枚舉嗎?”

“是的。”

“然後繼承一個枚舉?”

“不,你不能繼承一個枚舉,一個枚舉也不能繼承其他類。”

“這是為什麼?”

“因為 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類的變量實際上是public static final Direction變量。這在使用它們的代碼中很明顯:

方向direction = Direction .LEFT ;

4) Direction 類只有一個構造函數並且是私有的。這意味著只能使用類內部的代碼創建 Direction 對象。除了聲明的對象之外,不能創建任何對象。

5)可以為方向變量分配對任何現有方向對象的引用。它們都在枚舉中設置。沒有其他這種類型的對象,將來也不會有任何其他對象。

6)方向對象可以使用 «==» 進行比較,這只會執行一個簡單的引用比較。”

“我不會說它非常清楚,但在你的例子之後它會更清楚。”

“太好了。那麼這裡有一些更多的信息給你:”

1)每個 Direction 對像都有自己唯一的編號。第一個 (UP) 為 0,第二個 (DOWN) 為 1,第三個 (LEFT) 為 2,等等。您可以使用 ordinal() 方法獲取此數字。“看屏幕:

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

2)每個枚舉都有一個返回枚舉值數組的values () 方法。

int leftIndex = Direction.LEFT.ordinal();

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

“這意味著我們可以獲得任何枚舉元素的索引,然後使用該索引再次獲取該元素。”

“我們還可以在foreach循環中使用枚舉:”

for (Direction direction : Direction.values())
{
 System.out.println(direction);
}
屏幕輸出:
UP
DOWN
LEFT
RIGHT

“這是否意味著枚舉覆蓋了 toString 方法?畢竟,它不會顯示類似:”
«com.codegym.Direction@123fd4» 的內容?

“是的。此外,每個枚舉和方向都可以轉換為字符串,反之亦然。”

轉換為字符串:
String left = Direction.LEFT.toString(); // left == "LEFT";
將字符串轉換為枚舉:
Direction direction = Direction.valueOf("LEFT");

“哦,知道了。”

“如果你將一個字符串傳遞給不在 Direction 中的 valueOf 函數會發生什麼?例如,«AMIGO»?”

“你怎麼認為?”

“例外?”

“是的。一個 IllegalArgumentException。”

“嗯,我們對枚舉世界的介紹到此結束。”