博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

JavaEE - 10枚举类

Posted on 2020-12-07 22:05  Kingdomer  阅读(75)  评论(0编辑  收藏  举报

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月