Java的枚举类

一、概述

  • 在jdk1.5之前,我们定义常量都是使用public static final修饰的,较难管理这些常量
  • 在jdk1.5之后引入了新的类型--枚举
  • 枚举
    • 用于定义有限数量的一组相同类型的常量
      • 例如一年的四季:春、夏、秋、冬
      • 例如错误的级别:低、中、高
    • 可以把相关的常量分组到一个枚举类型里,枚举提供了比常量更多的方法
    • 在枚举类型中定义的常量是该枚举类型的实例

二、枚举的使用

1、定义枚举的格式

权限修饰符 enum 枚举名称{

        实例1,实例2,实例3...;

}

  • 举例
public enum Level {
    LOW(30), MEDIUM(15), HIGH(7), URGENT(1);

    private int levelValue;

    private Level(int levelValue) {
        this.levelValue = levelValue;
    } 

    public int getLevelValue() {
        return levelValue;
    }
}

2、枚举类的主要方法

  • 在定义枚举类时用的是enum,而Enum是所有java语言枚举类型的公共基本类(注意Enum是抽象类),下面是Enum抽象类的常见方法
返回类型 方法名称 方法说明
int compareTo(E o) 比较此枚举与指定对象的顺序,例如按顺序定义了三个枚举对象abc,a和b比是-1,a和c比是-2,c和a比是2
boolean equals(Object other) 当指定对象等于此枚举常量时,返回true
Class<?> getDeclaringClass 返回与此枚举常量的枚举类型相对应的Class对象
Stirng name() 返回此枚举常量的名称,在其枚举声明中对其进行声明
int ordinal() 返回枚举常量的序数(它在枚举声明中的位置,其初始常量序数为0)
String toString() 返回枚举常量的名称,它包含在声明中
static<T extends Enum<T>> static valueOf(Class<T> enumType, String name) 返回带指定名称的指定枚举类型的枚举常量

3、实现接口的枚举类

  • 所有的枚举都继承自java.lang.Enum类,由于java不支持多继承,所以枚举对象不能再继承其他类
  • 枚举类实现接口后,每个枚举对象都可以实现自己的抽象方法
  • 举例
public enum Demo implements Test{
    LOW{
        @Override
        public void say() {
            System.out.println("LOW say");
        }
    },MEDIUM{
        @Override
        public void say() {
            System.out.println("MEDIUM say");
        }
    },HIGH{
        @Override
        public void say() {
            System.out.println("HIGH say");
        }
    };
}

interface Test{
    void say();
}

三、枚举类注意事项

  • 一旦定义了枚举,最好不要妄图修改里面的值,除非修改是必要的
  • 枚举类默认继承的是java.lang.Enum类,而不是Object类
  • 枚举类不能有子类,因为其枚举类默认被final修饰
  • 只能有private构造方法
  • switch中使用枚举时,直接使用常量名,不用携带类名
    • 举例,在上面的枚举类中加一个方法
public static void choice(Demo demo){
        switch (demo){
            case LOW:
                System.out.println("LOW");
                break;
            case MEDIUM:
                System.out.println("MEDIUM");
                break;
            case HIGH:
                System.out.println("HIGH");
                break;
        }
  • 不能定义name属性,因为自带name属性
  • 不要为枚举类中的属性提供set方法,因为不符合枚举最初设计的初衷
    • 即第一条注意事项,最好不要修改枚举类里定义好的值

Guess you like

Origin blog.csdn.net/future_god_qr/article/details/121280430