简单总结下Java枚举的用法,因为发现有的工程师还是喜欢用的。
原理
枚举类中得枚举项都会被编译成static final T类型的对象作为枚举类的属性
接下来我们以实例的方式讲解枚举类的属性与方法
- 由于枚举类已经继承了Enum类,所以不能继承其他的类。
- 由于枚举类会被编译器处理为final类,所以不能被继承。
- enum是一个关键字,使用enum定义的枚举类本质上就相对于一个类继承了Enum这个抽象类而已。所以说enum定义的枚举结构实际上就是一个多例类!
- 枚举其实就是特殊的常量类,且构造方法被默认强制是私有。(阿里巴巴编程规范)
使用
public enum Weekday {
SUN(0),MON(1),TUE(2);//通过构造函数指定属性值
int valueT;
Weekday(int v){
valueT = v;
}
public static void main(String[] args) {
for(Weekday w : Weekday.values()) {//values为所有的枚举项
System.out.println(w.name());//名称,即枚举项的字符含义
System.out.println(w.valueT);//自已定义的属性
System.out.println(w.ordinal());//枚举项所处次序,从0开始
}
}
}
switch()参数可以使用enum
enum Signal {
GREEN, YELLOW, RED
}
public class TrafficLight {
Signal color = Signal.RED;
public void change() {
switch (color) {//参数是枚举类的话,底下可以直接case枚举项
case RED:
color = Signal.GREEN;
break;
case YELLOW:
color = Signal.RED;
break;
case GREEN:
color = Signal.YELLOW;
break;
}
}
}
使用枚举实现线程安全的单例模式
public class User {
//私有化构造函数
private User(){ }
//定义一个静态枚举类
static enum SingletonEnum{
//创建一个枚举对象,该对象天生为单例
INSTANCE;
private User user;
//私有化枚举的构造函数
private SingletonEnum(){
user=new User();
}
public User getInstnce(){
return user;
}
}
//对外暴露一个获取User对象的静态方法
public static User getInstance(){
return SingletonEnum.INSTANCE.getInstnce();
}
}