enum
1.产生背景
今天我们将探讨 Java 中的另一种数据类型:enum
. 这个名字enum
来自单词enumeration。这个数据类型是什么,它有什么用?
有时程序员需要创建一个新的数据类型,其可能的值被限制在一个小的固定列表中。
比如一个DayOfTheWeek
类型只能取值MONDAY
, TUESDAY
, WEDNESDAY
, ... 一共有7个值。或者一个Month
类型只能取值JANUARY
, FEBRUARY
, MARCH
, ... 总共有 12 个值。
当然,您可以使用数字(类型int
):1
— 星期一, — 星期二,等等。但是有人可能会不小心将无效值分配给您的变量2
,例如8
or 。0
您可能很容易遇到这样一种情况:一个程序员认为星期几(或一年中的几个月)是从零开始编号的,而其他人则希望他们的编号从一开始,等等。
这就是 Java 引入一种由有限值集enum
组成的数据类型的原因。
2.声明类型
声明一个新的enum
数据类型看起来像这样:
enum TypeName
{
VALUE1,
VALUE2,
VALUE3
}
哪里TypeName
是新类型(类)的名称,可能的值用逗号分隔并用花括号括起来:Value1
, Value2
, Value3
.
例如,让我们创建自己的DayOfTheWeek
enum
:
代码 | 笔记 |
---|---|
|
新Day 类型周一 周二 周三 周四 周五 周六 周日 |
以下是如何为我们的新类型的变量赋值:
Day day = Day.MONDAY;
例子:
代码 | 笔记 |
---|---|
|
屏幕输出将是:
|
3.方法enum
一个enum
类型有几个内置方法,其中两个非常有趣:
静态values()
方法返回该类型所有值的数组enum
:
代码 | 笔记 |
---|---|
|
变量days 存储一个包含类型值的数组Day (7 个元素)在屏幕上显示数组的内容:
|
该ordinal()
方法返回常量的序数。enum
你在一个值而不是一个类上调用它enum
:
代码 | 控制台输出 |
---|---|
|
|
4.转换为类
实际上,这里并没有什么神奇之处。编译器只是给了我们一些语法糖。在编译时,Day
枚举被转换为普通类:
代码,简化版 | 笔记 |
---|---|
|
Day class静态常量列表包含 枚举所有值的 Day 数组存储特定对象值的变量 该类是私有的,这意味着该类的对象只能在该类内部创建。必须在对象上调用 该方法。 它返回对象的值——字段。该方法返回一个包含类 的所有值的静态数组 Day Day constructor Day Day ordinal Day value Day |
如果我们从类中删除所有静态方法和变量Day
,我们将得到以下内容:
代码 | 笔记 |
---|---|
|
变量存储对象 value 的值对象只能在类内部创建,因为构造函数是. 该方法返回对象的。 Day Day Day private ordinal() value Day |
换句话说,这里没有发生任何可怕的事情。编译器创建Day
类,添加表示值的常量enum
,添加必要的方法,并生成类构造函数private
。稍后我们将看看构造函数是如何工作的。
希望现在清楚为什么我们以这种方式为变量赋值:
Day day = Day.MONDAY;
MONDAY
只是Day
类中的静态字段(常量)。从类外部访问静态方法和字段时,必须在字段或方法的名称之前指明类名。
5.更多方法enum
每个enum
班级都有几个有趣的特点。
与字符串相互转换
要将枚举对象转换为字符串,您需要调用它的toString()
方法。
String str = Day.MONDAY.toString();
要从另一个方向转换(从字符串到对象Day
),您可以使用静态valueOf()
方法:
Day day = Day.valueOf("MONDAY");
它非常方便,在很多情况下都会很有帮助。
转换为数字并再次返回
您已经知道如何将enum
对象转换为数字:调用ordinal()
方法:
int index = Day.MONDAY.ordinal();
要在另一个方向(从数字到对象Day
)转换,您需要一个更透明的结构:
Day day = Day.values()[2];
例子:
代码 | 笔记 |
---|---|
|
星期一 获取星期一的索引: 0 星期一后第 2 天的星期几 |
要点:因为enum
值是一组固定的常量,所以可以使用 == 比较它们。换句话说,您不能拥有两个MONDAY
具有不同地址的相同对象。每个枚举值只存在一个实例。这意味着使用 == 比较枚举变量将始终有效。
6. 将自己的方法添加到enum
因为anenum
在编译时变成了一个普通的类,你可以在里面声明方法。这些方法只是简单地添加到编译器生成的类中。例如,假设我们希望我们Day enum
返回一个枚举值列表而不是一个数组。
然后我们可以添加以下代码:
代码 | 笔记 |
---|---|
|
值列表后需要分号。 创建 ArrayList 对象添加方法返回的数组中的值 values() 。返回列表。 |
现在可以在代码中调用此方法:
代码 | 笔记 |
---|---|
|
该list 变量将存储 的所有值的列表Day enum 。 |