java枚举基础了解
从JDK1.5开始,java提供了新的关键字enum来实现枚举类型。
1.什么枚举?有什么作用?
枚举相当于一个特殊的类,无法直接创建对象,只能在枚举类内部声明固定个数的枚举对象,本质上是一个私有化了构造方法的抽象类。枚举出现之前,程序员总是要手动实现枚举的功能。这么说你可能不大理解,来看一下具体实例。
2.伪代码实例
class Week{
public static final Week Mon = new Week();
public static final Week Tue = new Week();
public static final Week Wed = new Week();
public static final Week Thu = new Week();
public static final Week Fri = new Week();
public static final Week Sta = new Week();
public static final Week Sun = new Week();
private Week(){
}
}
如上代码,我们想要写一个代表星期的类Week,对外提供七个实例对象,分别代表周一到周日,首先需要私有化构造方法,目的是不让外部直接new对象,然后在Week类中声明我们需要的七个代表星期的属性,用final修饰是为了防止外界通过Week.Mon=null将属性的值更改,这样我们就初步完成了代表星期的类Week的代码。
这是JDK1.5之前人们的写法,JDK1.5之后,枚举出现了,用枚举实现上述功能,代码如下:
enum WeekEnum{
Mon,Tue,Wed,Thu,Fri,Sta,Sun
}
如上,使用枚举简单一行代码就实现了该功能。枚举的出现大大简化了代码,所以说枚举出现之前,人们都是手动实现枚举的功能。
3.枚举的其他特点
3.1枚举可以拥有属性,也可以有构造方法,构造方法必须是私有的
我们还是用对比方法来介绍
以前的逻辑代码:
class Week{
public static final Week Mon = new Week(1);
public static final Week Tue = new Week(2);
public static final Week Wed = new Week(3);
public static final Week Thu = new Week(4);
public static final Week Fri = new Week(5);
public static final Week Sta = new Week(6);
public static final Week Sun = new Week(7);
public int day = 0;
private Week(int day){
this.day = day;
}
}
用枚举表示:
enum WeekEnum{
Mon(1),Tue(2),Wed(3),Thu(4),Fri(5),Sta(6),Sun(7)
public int day = 0;
private WeekEnum(int day){
this.day = day;
}
}
一样的功能,枚举的代码依旧如此简洁,枚举里出现构造函数需要注意一点,就是私有化构造函数。
3.2枚举可以拥有普通方法
我们想通过getDay()方法获取day的属性值
以前的逻辑代码:
class Week{
public static final Week Mon = new Week(1);
public static final Week Tue = new Week(2);
public static final Week Wed = new Week(3);
public static final Week Thu = new Week(4);
public static final Week Fri = new Week(5);
public static final Week Sta = new Week(6);
public static final Week Sun = new Week(7);
private int day = 0;
private Week(int day){
this.day = day;
}
public int getDay(){
return this.day;
}
}
用枚举表示:
enum WeekEnum{
Mon(1),Tue(2),Wed(3),Thu(4),Fri(5),Sta(6),Sun(7)
private int day = 0;
private WeekEnum(int day){
this.day = day;
}
public int getDay(){
return this.day;
}
}
3.3枚举可以拥有抽象方法
以前的逻辑代码:
abstract class Week{
public static final Week Mon = new Week(1){
@Override
public boolean isRestDay(){
return false;
}
};
public static final Week Tue = new Week(2){
@Override
public boolean isRestDay(){
return false;
}
};
public static final Week Wed = new Week(3){
@Override
public boolean isRestDay(){
return false;
}
};
public static final Week Thu = new Week(4){
@Override
public boolean isRestDay(){
return false;
}
};
public static final Week Fri = new Week(5){
@Override
public boolean isRestDay(){
return false;
}
};
public static final Week Sta = new Week(6){
@Override
public boolean isRestDay(){
return true;
}
};
public static final Week Sun = new Week(7){
@Override
public boolean isRestDay(){
return true;
}
};
private int day = 0;
private Week(int day){
this.day = day;
}
public int getDay(){
return this.day;
}
public abstract boolean isRestDay();
}
因为是抽象类,所以使用匿名内部类,不熟悉的小伙伴可以查阅匿名内部类相关文章。
用枚举表示:
enum WeekEnum{
Mon(1){
@Override
public boolean isRestDay(){
return false;
}
},
Tue(2){
@Override
public boolean isRestDay(){
return false;
}
},
Wed(3){
@Override
public boolean isRestDay(){
return false;
}
},
Thu(4){
@Override
public boolean isRestDay(){
return false;
}
},
Fri(5){
@Override
public boolean isRestDay(){
return false;
}
},
Sta(6){
@Override
public boolean isRestDay(){
return true;
}
},
Sun(7){
@Override
public boolean isRestDay(){
return true;
}
};
private int day = 0;
private WeekEnum(int day){
this.day = day;
}
public int getDay(){
return this.day;
}
public abstract boolean isRestDay();
}
3.4枚举自带方法
所有的枚举类都继承自Enum类,所以自动就会具有Enum类中定义的方法。
name() //获取枚举常量的名字
ordinal() //获取枚举常量的序数