在涉及到使用大量需要标记的内容的时候,我们一般选择使用枚举类型来快速定义内容,但是不仅仅是因为快速,同时使用枚举类型更加的安全.
引入:
举个例子:
现在需要来不使用枚举来表示一周七天用来安排放假时间我们如何在程序中表达:
首先是对一个星期的每一天进行定义
方法A:
class week{
static int Monday = 1;
static int Tuesday = 2;
static int Wednesday = 3;
static int Thursday = 4;
static int Friday = 5;
static int Saturday = 6;
static int Sunday = 7;
}
方法B:
class week{
final static int Monday = 1;
final static int Tuesday = 2;
final static int Wednesday = 3;
final static int Thursday = 4;
final static int Friday = 5;
final static int Saturday = 6;
final static int Sunday = 7;
}
方法C:
class week{
final static week Monday = new week();
final static week Tuesday = new week();
final static week Wednesday = new week();
final static week Thursday = new week();
final static week Friday = new week();
final static week Saturday = new week();
final static week Sunday = new week();
}
-
方法A
:
直接将每一天作为整型变量存储起来,这会导致两个问题:
首先作为一个变量自然是可变的,这会导致这个变量被更改
而且作为一个数字在被调用的时候可以直接使用其他数据,例如public static void main(String[] args) { Worker worker = new Worker(); worker.setFreeDay(week.Saturday); worker.setFreeDay(1); worker.setFreeDay(9); }
出现了一下意料之外的数据,比如
星期九?
-
方法B:
解决了数据会被篡改的问题啊因为使用final修改为了常量
但是依旧没有解决数字会被随意调用的问题 -
方法C:
使用week
对象来作为内容,对象是唯一的这保证了不会被随意调用
实际上使用枚举就是在使用当前方法
枚举类型的本质:
还是使用以上的数据,我们定义一个枚举类型:
enum week{
Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday
}
编译之后我们使用反编译工具进行查看
final class week extends Enum
{
public static final week Monday;
public static final week Tuesday;
public static final week Wednesday;
public static final week Thursday;
public static final week Friday;
public static final week Saturday;
public static final week Sunday;
private static final week $VALUES[];
public static week[] values()
{
return (week[])$VALUES.clone();
}
public static week valueOf(String name)
{
return (week)Enum.valueOf(week, name);
}
private week(String s, int i)
{
super(s, i);
}
static
{
Monday = new week("Monday", 0);
Tuesday = new week("Tuesday", 1);
Wednesday = new week("Wednesday", 2);
Thursday = new week("Thursday", 3);
Friday = new week("Friday", 4);
Saturday = new week("Saturday", 5);
Sunday = new week("Sunday", 6);
$VALUES = (new week[] {
Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday
});
}
}
可以看大反编译的内容实际上enum
类型就是一个继承了Enum
类的类,也就是说enum
枚举类型实际上就是一个类,而在之中我们可以看见其中的成员变量类似于方法C
,只不过初始化是集中在后面的
private week(String s, int i)
这是他的构造器,使用私有是因为枚举类型不需要被实例化
public static week[] values()
这个方法的作用是讲当前的枚举类型转化为枚举类型数组,因为枚举类型本身没有下标,可以通过这种方式实现用索引找到内容
public static week valueOf(String name)
返回指定名称的内容
所以枚举类型的本质就是一个类
Enum:
Enum
是所有枚举类型的父类,其中包含了对枚举类型进行控制,和操作的方法
他的构造器:
protected Enum(String name, int ordinal) {
this.name = name;
this.ordinal = ordinal;
}
可以看到他使用protect
就是为了给子类经常同时让其他的类无法实例对象实现枚举类型的特征
两个参数分别为: 名称
,索引
而枚举类型的构造器如上面的week
private week(String s, int i)
{
super(s, i);
}
可想而知super
指的就是Enum构造器
以上便是枚举类型的大概用法,和本质,如有错误欢迎指正