- 枚举
- 栗子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.lang.Enum的类。
java枚举类型的实现原理:https://blog.csdn.net/mhmyqn/article/details/48087247
参考地址深入理解Java枚举类型(enum):https://blog.csdn.net/cauchy6317/article/details/82313088



