1. 枚举
枚举是在JDK1.5以后引入的。主要用途是:将一组常量组织起来,在这之前表示一组常量通常使用定义常量的方式:
//用public static final修饰常量
public static final int RED = 1;
public static final int GREEN = 2;
public static final int BLACK = 3;
但是常量列举也存在不合理的地方,当我们想要一个数字1,但是此时RED所代表的值就是1,我们如何确定我们想要用到的是我们定义的常量RED还是单纯的数字1呢?这样的情况下,我们引入了枚举类型,用来表达我们所需要的特殊信息。
1.1 定义
所有的枚举类都默认继承Enum类
,也就是说所有的枚举类都是是 java.lang.Enum 的子类
。
//枚举是个特许的类
修饰符 enum 枚举类名{
枚举实例,...,...;
}
示例:
enum Color {
RED,GREEN,BLUE;//枚举实例
//方法...
}
Java中的枚举实际上就是一个类,也就是说我们在定义枚举类的时候,不仅可以在前面声明枚举实例,还可以定义字段和方法。
实例:
public enum Color {
RED("红色",1),GREEN("绿色",2),BLUE("蓝色",3);
private String name;
private int key;
//枚举的构造方法默认是私有的
private Color (String name,int key) {
this.name = name;
this.key = key;
}
public static Color getEnumKey (int key) {
for (Color t : Color.values()) {
if (t.key == key) {
return t;
}
}
return null;
}
public static void main(String[] args) {
System.out.println(getEnumKey(1));
}
}
运行结果如下:
这里我们注意到当构造方法是显示提供的有参数的构造方法时,我们的枚举实例也带上了参数,否则编译报错;这是因为我们上面的枚举实例其实就相当于我们普通类调用对应的构造方法实例对象的过程,只不过实例的过程是在枚举类中进行,这是为了确保了枚举常量的唯一性和一致性。
总结:
枚举实例时在枚举类加载时自动创建的,不能在枚举类外部创建新的枚举实例,这是因为构造方法是私有的:枚举类的构造方法被声明为
private
,这意味着只有枚举类内部可以调用它来创建实例。外部代码无法调用这个构造函数。
1.2 用途
1. switch
使用枚举,能让我们的代码可读性更强。
public static void main(String[] args) {
Color color = Color.GREEN;
switch (color) {
case RED:
System.out.println("red");
break;
case BLUE:
System.out.println("blue");
break;
case GREEN:
System.out.println("green");
break;
default:
System.out.println("没有这个枚举实例");
break;
}
}
2. 常用方法
Enum
类中的常用方法
方法名 | 作用 |
---|---|
values() | 以数组形式返回枚举类型的所有成员 |
ordinal() | 获取枚举成员的索引位置 |
valueOf() | 将普通字符串转换为枚举实例,存在这个枚举实列就返回这个枚举实例,不存在就抛出异常 |
compareTo() | 比较两个枚举成员在定义时的顺序 |
public static void main(String[] args) {
Color[] colors = Color.values();
for (int i = 0; i < colors.length; i++) {
System.out.println(colors[i] + " " + colors[i].ordinal());
}
System.out.println("=========================");
System.out.println(Color.valueOf("GREEN"));
//System.out.println(Color.valueOf("WHILE"));//抛出异常
System.out.println("=========================");
//拿到枚举实例BLUE
Color color1 = Color.BLUE;
//拿到枚举实例RED
Color color2 = Color.RED;
System.out.println(color1.compareTo(color2));
}
在学习完枚举后,我们可以思考以下问题:
为什么枚举实现单列模式是安全的?
枚举在反射中被过滤了,不能通过反射获取枚举类的实例