- 优点:类型安全,业务明确
- 格式
public enum Weekday { MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATUERDAY,SUNDAY; } public enum Gender { //枚举值调用对应构造器创建 MALE("男") { public void info() { System.out.println("这个枚举值代表男性"); } }, FEMALE("女") { public void info() { System.out.println("这个枚举值代表女性"); } }; private final String name; private Gender(String name) { this.name = name; } public String getName() { return this.name; } public void info() { System.out.println("这是一个定义性别的枚举类"); } } public static void main(String args[]) { System.out.println(Gender.MALE);//MALE System.out.println(Gender.MALE.getName());//男 Gender.MALE.info();//这个枚举值代表男性 }
- 特点
- 可以定义构造器,成员变量,普通方法和抽象方法
- 隐式继承了java.lang.Enum类,但不能显式继承其他父类
- 默认构造器使用private修饰,一旦枚举类显式定义了带参数化的构造器,累出枚举值时就必须对应传入参数
- 枚举类所有实例必须在枚举类第一行显式列出,列出实例时,系统默认用public static final修饰,枚举类列举后以;作为结束,
- 枚举类后{},该枚举类实例时枚举类匿名内部子类的对象
- 实现了Comparable接口–可比较
- 实现了Serializable接口–可序列化
- 使用
- 使用该枚举类的某个实例:EnumClass.variable
- Weekday day = Weekday.SATURDAY;
- 枚举类S.values()//遍历枚举常量列表
- 枚举常量s.ordinal()//返回从0开始的int值–枚举实例的声明顺序
- 枚举实例s.getDeclaringClass()//得到枚举实例所属的外部包装类
- s.name()//枚举实例被声明的名称 <=> toString()
- Enum.valueOf(S.class,s)//根据传入的String (s) 匹配枚举实例,不存在则抛出异常
- Enum 类中的实例方法用法:
- String name();返回该枚举实例的常量名
- int ordinal();返回该枚举值在枚举类中的索引,从0开始
- String toString();返回该枚举实例的常量名
- boolean equals();当制定对象等于此枚举常量时,返回true;
- 枚举类默认提供的类方法(从反编译代码)
//枚举类型[] values() 返回该枚举类所有枚举对象组成的数组
Weekday[] ws = Weekday.values();
//枚举类型 valueOf(String name):返回名称为name的枚举对象
Weekday day = Weekday.valueOf("MONDY");
- switch 也支持操作枚举类型
- switch 的控制表达式可以是枚举类型变量,case表达式中的值直接使用枚举类的名字,无需添加枚举类作为限定
- 底层调用枚举对象的ordinal()方法该方法返回值类型时int
- 枚举类可做单例模式
参考:Java笔记-18枚举类