Java enum枚举类详解 枚举的常见用法

什么时候用枚举?

类的对象是有限个的确定的时候,可以考虑用枚举,例如

Thread.State(线程的状态):创建,就绪,运行,阻塞,死亡

星期:周一...周日

季节:Spring , Summer,Autumn,Winter

等一系列一组常量的定义时,强烈建议使用枚举类

相信不少同学第一次接触enum的时候很迷茫,这个关键字是什么意思?代码这样写有什么意义?

enum是jdk1.5版本提供的枚举关键字,看看enum出之前如何定义枚举类的,相信不少小伙伴看完能豁然开朗

这里就以季节为例

//不使用enum的方式定义枚举类
class Season {
    //定义枚举类属性
    private final String SeasonName;

    //私有化构造方法,初始化季节值
    private Season(String seasonName) {
        this.SeasonName = seasonName;
    }

    //创建春夏秋冬静态对象
    public static final Season SPRING = new Season("Spring");
    public static final Season SUMMER = new Season("Summer");
    public static final Season AUTUMN = new Season("Autumn");
    public static final Season WINTER = new Season("Winter");

    //重新toSring
    @Override
    public String toString() {
        return "Season{" +
                "SeasonName='" + SeasonName + '\'' +
                '}';
    }

    //获取属性
    public String getSeasonName() {
        return SeasonName;
    }


}

 

 Season season = Season.AUTUMN;
        

上述代码即可创建一个枚举类实例,对不熟悉enum的同学来说这种写法相信更容易理解,而且看起来与单例饿汉式有点相似,事实上单例模式完全可以用枚举类定义

那enum有什么区别呢?我把上面的代码用enum定义来看看

enum Season {
    //定义枚举静态对象
    //原代码
/*    public static final Season SPRING = new Season("Spring");
    public static final Season SUMMER = new Season("Summer");
    public static final Season AUTUMN = new Season("Autumn");
    public static final Season WINTER = new Season("Winter");*/
   //省略了public static final 以及new 对象的操作 必须放在类首行
    SPRING("Spring"),//使用,做间隔
    SUMMER("Summer"),
    AUTUMN("Autumn"),
    WINTER("Winter");

    private final String SeasonName;


    private Season(String seasonName) {
        this.SeasonName = seasonName;
    }

    @Override
    public String toString() {
        return "Season{" +
                "SeasonName='" + SeasonName + '\'' +
                '}';
    }

    public String getSeasonName() {
        return SeasonName;
    }

}

很明显能看出来,省略了new对象和public static final的修饰词,那除此之外还有什么区别呢

Java enum枚举类详解 枚举的常见用法_第1张图片

在方法里测试的时候,可以很清楚的看到,Season除了四个枚举常量之外还有三个方法,一个values,一个valusOf以及他的重载方法

那这三个方法是从哪里来的呢,难不成enum对象不是直接继承的Object吗,别急我们打印出来看一下

System.out.println(Season.class.getSuperclass());

输出结果是class java.lang.Enum

看来enum关键字修饰的枚举类,默认继承于java.lang.Enum

java.lang.Enum也又几个常用的方法

values(),返回的是一个包括所有枚举类对象的数组,方便遍历,但是用Arrays.toString()不能直接输出,必须自己亲自遍历

valueOf(String )是通过元素名字获取枚举类对象

enum中的toSring方法也重写过了,默认输出枚举类对象名,如有需要可以自己重写

既然enum相当于一个默认继承了 java.lang.Enum的枚举类,那他可不可以实现接口,或者继承/被继承呢

先说继承,既然他已经默认继承于 java.lang.Enum,那他当然不能继承别的类了,另外,因为构造方法私有化的原因,当然也不可以被别的类继承

那么说说接口,既然本质上还是一个普通的类,那自然是可以实现接口的,而且实现方式和别的类也没什么区别

//使用enum关键字使用接口
interface Info {
    void show();
}


enum Season implements Info{

    //定义枚举静态对象
    SPRING("Spring"),
    SUMMER("Summer"),
    AUTUMN("Autumn"),
    WINTER("Winter");
    private final String SeasonName;


    Season(String seasonName) {
        this.SeasonName = seasonName;
    }

    @Override
    public String toString() {
        return "Season{" +
                "SeasonName='" + SeasonName + '\'' +
                '}';
    }

    public String getSeasonName() {
        return SeasonName;
    }

    @Override
    public void show() {
        System.out.println("这是一个季节");
    }
}

还可以给不同的枚举类对象独立的实现方法,如下

  //定义枚举静态对象
    SPRING("Spring"){
        @Override
        public void show() {
            System.out.println("This is Spring ");
        }
    },


关于枚举类大概就说到这里了,水平有限,有什么错误或者想补充的都可以在评论区指出

你可能感兴趣的:(java,java,javaee)