Java枚举的原理
枚举其实就是一个类,这个类中所有的枚举都是这个类的实例,如下:
public enum SignalLight{
RED(),
GREEN(),
YELLOW();
}
也可以把括号和分号去掉写成以下几种写法:
public enum SignalLight{
RED,GREEN,YELLOW
}
public enum SignalLight{
RED,GREEN,YELLOW;
}
public enum SignalLight{
RED(),GREEN(),YELLOW()
}
在以上代码中,例如RED就是SignalLight这个类的实例,而且该类有且仅有RED、GREEN和YELLOW这三个实例。既然是类,就可以定义成员变量。
自定义Java枚举的成员变量和成员方法
当我们在实例的括号里填写参数时,Java就要求我们编写构造方法,且构造方法必须时私有的,注意:当枚举类中有除了实例列表以外的内容时就需要在实例列表最后一个后边加上分号,如下:
public enum SignalLight{
GREEN("绿灯", "green"),
RED("红灯", "red"),
YELLOW("黄灯", "yellow");
private Light(String chineseName, String englishName) {}
}
我们可以将从构造方法参数列表里传过来的值加以利用,于是我们可以在SignalLight类(枚举)中添加成员属性并在构造方法中为其赋值并为其编写get set方法。同时,枚举类中也可以重写toString方法,如下:
public enum SignalLight{
GREEN("绿灯", "green"),
RED("红灯", "red"),
YELLOW("黄灯", "yellow");
// 成员变量
private String chineseName;
private String englishName;
// 构造器
private Light(String chineseName, String englishName) {
this.chineseName = chineseName;
this.englishName = englishName;
}
// get set方法
public String getChineseName() {
return chineseName;
}
public void setChineseName(String chineseName) {
this.chineseName = chineseName;
}
public String getEnglishName() {
return englishName;
}
public void setEnglishName(String englishName) {
this.englishName = englishName;
}
// 重写toString方法
@Override
public String toString() {
return ordinal() + chineseName + englishName;
}
}
这样一个简单完整的枚举类就写完了,下面我们看看如何使用它。
Java枚举的使用
在枚举中有几个常用的内置方法:
- name()方法:该方法返回枚举实例的名字,类型String
- ordinal()方法:该方法返回枚举实例的序号,类型int,从0开始。
- values()方法:该方法返回一个枚举实例数组。
下面演示一下使用方法:
public class Main {
public static void main(String[] args) {
SignalLight sl = SignalLight.GREEN;
System.out.println("直接打印:" + sl); // 直接打印——直接调用toString方法
System.out.println("调用name()方法:" + sl.name()); // 调用name()方法
System.out.println("调用ordinal()方法:" + sl.ordinal()); // 调用ordinal()方法
System.out.println("通过当前实例可以获得枚举中的其他实例:" + sl.RED); // 通过当前实例可以获得枚举中的其他实例
SignalLight[] all = sl.values(); // 调用values()方法可以返回枚举数组 数组中包含所有该枚举的实例
for (int i = 0; i < all.length; i++) {
System.out.println("数组遍历:" + all[i]);
}
System.out.println(sl.getEnglishName() + " " + sl.getChineseName());
}
}
控制台打印效果:
原理补充
枚举是类的一种,而且枚举类已经默认继承了java.lang.Enum<E>
类,所以理论上枚举不可以再继承其他类,仅能实现接口。