枚举及其所有功能 - 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。”

“嗯,我们对枚举世界的介绍到此结束。”