JavaEE - 10枚举类
(1)枚举类
(1.1)入门
- 类的对象 只有 有限个,确定的。如下
- 星期: Monday(星期一)、......、Sunday(星期天)
- 性别: Man(男)、Woman(女)
- 季节: Spring(春季)、......、Winter(冬季)
- 线程状态: 创建、就绪、运行、阻塞、死亡
- 当需要定义一组常量时,强烈建议使用枚举类。
(1.2)枚举类实现
- JDK1.5之前需要自定义枚举类;JDK1.5之后新增 enum 关键字用于定义枚举类
- 枚举只有一个对象,则可以作为一种单例模式的实现方式。
- 枚举值的属性
- 枚举值对象的属性不应允许被改动,所以应该使用private final 修饰
- 枚举类的使用 private final 修饰的属性应该在构造器中为其赋值
- 如枚举类显式的定义了带参数的构造器,则在列出枚举值时也必须对应的传入参数
(1.3)自定义枚举类
//自定义枚举类 public class Season { //1. 声明Season对象的属性: private final修饰 private final String seasonName; private final String seasonDesc; //2. 私有化类的构造器,并给对象属性赋值 private Season(String seasonName, String seasonDesc){ this.seasonName = seasonName; this.seasonDesc = seasonDesc; } //3. 提供当前枚举类的多个对象 public static final Season SPRING = new Season("春天","春暖花开"); public static final Season SUMMER = new Season("夏天","夏日炎炎"); public static final Season AUTUMN = new Season("秋天","秋高气爽"); public static final Season WINTER = new Season("冬天","冬雪皑皑"); // 4. 其他诉求: 获取枚举类对象的属性 public String getSeasonName(){ return seasonName; } public String getSeasonDesc(){ return seasonDesc; } }
测试:
public class SeasonTest { public static void main(String[] args) { Season spring = Season.SPRING; Season summer = Season.SUMMER; System.out.println(spring.getSeasonName() +"-->" + spring.getSeasonDesc()); System.out.println(summer.getSeasonName() +"-->" + summer.getSeasonDesc()); } }
(1.4)Enum类的方法
方法 | 详细描述 |
values()
|
返回枚举类型的对象数组。该方法可以很方便地遍历所有的枚举值。
|
valueOf(String str)
|
可以把一个字符串转化为对应的枚举类对象。要求字符串必须是枚举类对象的名字。若不是,运行时异常:IllegalArgumentException。
|
toString()
|
返回当前枚举类对象常量的名称。通过重写这个方法来使得到的结果更易读。
|
equals | 在枚举类型中可以直接使用"=="来比较两个枚举常量是否相等。它的存在是为了在Set、List和Map中使用。equals是不可变的。 |
hashCode | Enum实现了 hashCode() 来和 equals()保持一致。它也是不可变的。 |
getDeclaringClass | 得到枚举常量所属枚举类型的Class对象。用它来判断两个枚举常量是否属于同一个枚举类型。 |
name | 得到当前枚举常量的名称。建议优先使用toString()。 |
ordinal | 得到当前枚举常量的次序。 |
compareTo | 枚举类型实现了Compareable接口,可以比较两个枚举常量的大小(按照声明的顺序排列) |
clone | 枚举类型不能被Clone。为防止子类实现克隆方法,Enum实现了一个仅抛出CloneNotSupportedException异常的不变Clone()。 |
public enum Season1 { //3. 提供当前枚举类的多个对象,多个对象之间用","分隔, 末尾对象";"结束。 SPRING("春天","春暖花开"), SUMMER("夏天","夏日炎炎"), AUTUMN("秋天","秋高气爽"), WINTER("冬天","冬雪皑皑"); //1. 声明Season对象的属性: private final修饰 private final String seasonName; private final String seasonDesc; //2. 私有化类的构造器,并给对象属性赋值 private Season1(String seasonName, String seasonDesc){ this.seasonName = seasonName; this.seasonDesc = seasonDesc; } }
public class SeasonTest { public static void main(String[] args) {
Season1 summer = Season1.SUMMER; System.out.println(summer); //SUMMER System.out.println(Season1.class.getSuperclass()); //class java.lang.Enum Season1[] values = Season1.values(); for(int i=0; i< values.length; i++){ System.out.println(values[i]); // SPRING SUMMER autumn WINTER } // Thread State 枚举类 Thread.State[] states = Thread.State.values(); for(int i=0; i< states.length; i++){ System.out.println(states[i]); // NEW RUNNABLE BLOCKED WAITING TIMED_WAITING TERMINATED } // valueOf(String objName): 返回枚举类中对象名为objName的对象 Season1 winter = Season1.valueOf("WINTER"); System.out.println(winter); //WINTER } }
Season1 winter = Season1.valueOf("WINTER1") // WINTER1 不存在时,报错 Exception in thread "main" java.lang.IllegalArgumentException: No enum constant Season1.WINTER1 at java.lang.Enum.valueOf(Enum.java:238) at Season1.valueOf(Season1.java:6) at SeasonTest.main(SeasonTest.java:30)
(1.5)使用enum关键字定义的枚举类实现接口
public interface Info { void show(); }
枚举类实现接口,在每个枚举上
public enum Season1 implements Info { //3. 提供当前枚举类的多个对象: public static final 的 SPRING("春天","春暖花开"){ public void show(){ System.out.println("春天在1-3月"); } }, SUMMER("夏天","夏日炎炎"){ public void show(){ System.out.println("夏天在4-6月"); } }, AUTUMN("秋天","秋高气爽"){ public void show(){ System.out.println("秋天在7-9月"); } }, WINTER("冬天","冬雪皑皑"){ public void show(){ System.out.println("冬天在10-12月"); } }; // 省略其他代码 }
测试:
Season1 winter = Season1.valueOf("WINTER"); System.out.println(winter); //WINTER winter.show(); //冬天在10-12月