什么时候用枚举?
类的对象是有限个的确定的时候,可以考虑用枚举,例如
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的修饰词,那除此之外还有什么区别呢
在方法里测试的时候,可以很清楚的看到,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 ");
}
},
关于枚举类大概就说到这里了,水平有限,有什么错误或者想补充的都可以在评论区指出