Java 枚举类的使用栗子
- 枚举
- 栗子1,基础的枚举使用方式以及方法调用
- 栗子2,枚举类内部定义参数
- 栗子3,枚举类内部定义多个参数
- 栗子4,枚举类内部定义方法
- 本质
- 实现原理
- 参考地址
枚举
枚举类型是Java 5中新增特性的一部分,它是一种特殊的数据类型,之所以特殊是因为它既是一种类(class)类型却又比类类型多了些特殊的约束,但是这些约束的存在也造就了枚举类型的简洁性、安全性以及便捷性。
通俗点:枚举类是一种特殊的数据类型,类型是特殊的“类”,是Class哦,一般的Class可以用的处理,他也都可以用。这个类型一般用于替代常量,同时不要忘记他是类,所以他也可以定义参数、构造方法和一般方法,这种情况下,他能做的就多了。
栗子1,基础的枚举使用方式以及方法调用
定义枚举类
public enum WeekEnum {
MONDAY,
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY,
SUNDAY
}
调用:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_enum2);
System.out.println(WeekEnum.MONDAY);
System.out.println(WeekEnum.TUESDAY);
System.out.println(WeekEnum.WEDNESDAY);
System.out.println(WeekEnum.THURSDAY);
System.out.println(WeekEnum.FRIDAY);
System.out.println(WeekEnum.SATURDAY);
System.out.println(WeekEnum.SUNDAY);
System.out.println("===================分割线===================");
System.out.println(WeekEnum.MONDAY.name());
System.out.println(WeekEnum.MONDAY.toString());
System.out.println(WeekEnum.MONDAY.getClass());
System.out.println(WeekEnum.MONDAY.getDeclaringClass());
System.out.println(WeekEnum.MONDAY.ordinal());
System.out.println(WeekEnum.MONDAY.hashCode());
System.out.println("===================分割线===================");
System.out.println(WeekEnum.MONDAY.ordinal());
System.out.println(WeekEnum.TUESDAY.ordinal());
System.out.println(WeekEnum.WEDNESDAY.ordinal());
System.out.println(WeekEnum.THURSDAY.ordinal());
System.out.println(WeekEnum.FRIDAY.ordinal());
System.out.println(WeekEnum.SATURDAY.ordinal());
System.out.println(WeekEnum.SUNDAY.ordinal());
}
输出:
I/System.out: MONDAY
I/System.out: TUESDAY
I/System.out: WEDNESDAY
I/System.out: THURSDAY
I/System.out: FRIDAY
I/System.out: SATURDAY
I/System.out: SUNDAY
I/System.out: ===================分割线===================
I/System.out: MONDAY
I/System.out: MONDAY
I/System.out: class com.yoshin.tspsdk.enum2.WeekEnum
I/System.out: class com.yoshin.tspsdk.enum2.WeekEnum
I/System.out: 0
I/System.out: 31483091
I/System.out: ===================分割线===================
I/System.out: 0
I/System.out: 1
I/System.out: 2
I/System.out: 3
I/System.out: 4
I/System.out: 5
I/System.out: 6
枚举类创建时会被装载序数,从0开始。
栗子2,枚举类内部定义参数
如果不想使用默认的序数,就需要重写一下类,定义一下参数。
定义枚举类
public enum CarCtrlEnum {
ENGINE(100), AIR(101), HEAT(102);
private int code;
CarCtrlEnum(int code) {
this.code = code;
}
public int code(){
return code;
}
}
调用
System.out.println(CarCtrlEnum.ENGINE);
System.out.println(CarCtrlEnum.AIR);
System.out.println(CarCtrlEnum.HEAT);
System.out.println(CarCtrlEnum.ENGINE.ordinal());
System.out.println(CarCtrlEnum.AIR.ordinal());
System.out.println(CarCtrlEnum.HEAT.ordinal());
System.out.println(CarCtrlEnum.ENGINE.code());
System.out.println(CarCtrlEnum.AIR.code());
System.out.println(CarCtrlEnum.HEAT.code());
输出:
I/System.out: ENGINE
I/System.out: AIR
I/System.out: HEAT
I/System.out: 0
I/System.out: 1
I/System.out: 2
I/System.out: 100
2021-12-07 15:25:40.951 3565-3565/com.yoshin.tspsdk I/System.out: 101
2021-12-07 15:25:40.951 3565-3565/com.yoshin.tspsdk I/System.out: 102
栗子3,枚举类内部定义多个参数
其实定义一个参数还是多个参数,都是和业务挂钩的。实现方式都是一样的。
定义枚举类
public enum CarCtrlEnum {
ENGINE(100, "适配多种车型"), AIR(101, "电车功能"),
HEAT(102, "油车功能"),SEND_TO_CAR(103,"适配多种车型");
private int code;
private String carModel;
CarCtrlEnum(int code, String carModel) {
this.code = code;
this.carModel = carModel;
}
public int code() {
return code;
}
public String model() {
return carModel;
}
}
调用
System.out.println(CarCtrlEnum.ENGINE.code());
System.out.println(CarCtrlEnum.AIR.code());
System.out.println(CarCtrlEnum.HEAT.code());
System.out.println(CarCtrlEnum.SEND_TO_CAR.code());
System.out.println(CarCtrlEnum.ENGINE.model());
System.out.println(CarCtrlEnum.AIR.model());
System.out.println(CarCtrlEnum.HEAT.model());
System.out.println(CarCtrlEnum.SEND_TO_CAR.model());
输出
I/System.out: 100
I/System.out: 101
I/System.out: 102
I/System.out: 103
I/System.out: 适配多种车型
I/System.out: 电车功能
I/System.out: 油车功能
I/System.out: 适配多种车型
如上业务,code表示车控功能,model表示哪种车型的功能。
栗子4,枚举类内部定义方法
public enum CarCtrlEnum {
ENGINE(100, "适配多种车型") {
@Override
public void sendOrder(int code, String carModel) {
//todo 下发指令
}
},
AIR(101, "电车功能") {
@Override
public void sendOrder(int code, String carModel) {
//todo 下发指令
}
},
HEAT(102, "油车功能") {
@Override
public void sendOrder(int code, String carModel) {
//todo 下发指令
}
}, SEND_TO_CAR(103, "适配多种车型") {
@Override
public void sendOrder(int code, String carModel) {
//todo 下发指令
}
};
private int code;
private String carModel;
CarCtrlEnum(int code, String carModel) {
this.code = code;
this.carModel = carModel;
}
public int code() {
return code;
}
public String model() {
return carModel;
}
public abstract void sendOrder(int code, String carModel);
}
如上只是演示方法怎么定义,一般来讲枚举的方法都是可以直接实现的,而不是调用长耗时。
本质
我们会发现java编译器在实现枚举类型的时候,其实是按照类类型来进行处理的,也就是说:枚举类型其本质上仍然是类,是一个继承自Enmu的类。但是由于编译器帮我们默默的做了一些事情,使得我们使用起来更加方便也更加高效。
实现原理
其实我们的现在的写法是经过加工的,编译器会帮助我们编译我们写的类,现实一个继承
java.lang.Enum的类。