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的类。