目录
一、为什么使用枚举类?
使用枚举类可以使代码更高效、更简洁、更安全,也更容易维护。比如可以使用枚举类来代替常量(public static final ...),限定数据的取值范围等。
一、枚举类原理
枚举类在编译后,会转换成一个实实在在的类,而在该类中,会存在每个在枚举类型中定义好变量的对应实例对象,如定义VARIABLE枚举类型生成对应的public static final T VARIABLE实例;同时编译器会为该类创建两个方法,分别是values()和valueOf()。
1、values()方法——编译器生成
作用是获取枚举类中的所有变量,并作为数组返回。
2、valueOf(String name)方法——编译器生成
根据枚举名称获取枚举常量,与Enum中的valueOf方法的作用类似,只不过这里只需传入一个参数,比使用可变参数,在提高效率和运行性能上更好一点。
3、valueOf(Class<T> enumType,String name)方法——Enum类方法
静态方法,根据枚举类的Class对象和枚举名称获取枚举常量,效果跟valueOf(String name)方法一样。
测试代码:对枚举方法进行测试
public enum Color {
GREEN,BLUE,RED,MAUVE,PURPLE;
public static void main(String[] args) {
// valueOf(String name)方法获取结果
System.out.println(Color.valueOf("GREEN"));
// valueOf(Class<T> enumType,String name)方法获取结果
System.out.println(Color.valueOf(Color.class,"GREEN"));
// values()获取结果
for(Color color : Color.values()){
System.out.println(color.name());
}
}
}
测试结果:
二、枚举类的使用
1、在枚举类中添加方法和自定义构造函数
演示代码:修改了枚举类的构造函数
public enum Color {
GREEN("绿色"),
BLUE("蓝色"),
RED("红色"),
MAUVE("紫红色"),
PURPLE("紫色");
// 私有化参数
private String desc;
// 提供公有的获取参数的方法
public String getDesc() {
return desc;
}
// 私有化构造方法,实际上在enum类中构造方法总是私有的
private Color(String desc){
this.desc = desc;
}
public static void main(String[] args) {
for(Color color : Color.values()){
System.out.println(color.name()+":"+color.getDesc());
}
}
}
演示结果:
2、在枚举类中定义抽象方法
演示代码:定义一个抽象方法,每个实例都需要实现它
public enum Color {
GREEN{// 实现抽象方法
@Override
public void doSomething() {
System.out.println("这代表绿色");
}
},
BLUE{
@Override
public void doSomething() {
System.out.println("这代表绿色");
}
},
RED{
@Override
public void doSomething() {
System.out.println("这代表红色");
}
};
// 定义抽象方法,这个做法其实是把属性固定绑定在了对应的实例上
public abstract void doSomething();
public static void main(String[] args) {
for(Color color : Color.values()){
System.out.print(color.name()+":");
color.doSomething();// 根据不同实例调用抽象方法
}
}
}
测试结果:
3、枚举类实现接口
演示代码:枚举类的枚举
public enum Color {
GREEN(DealColor.GREENCOLOR.class),
BLUE(DealColor.BLUECOLOR.class),
RED(DealColor.REDCOLOR.class);
private DealColor[] values;
private Color(Class<? extends DealColor> kind){
// 通过class获取枚举对象实例
this.values = kind.getEnumConstants();
}
public DealColor[] getValues() {
return values;
}
public interface DealColor{
enum GREENCOLOR implements DealColor{
MOSS_GREEN, EMERALD_GREEN, OLIVE_GREEN
}
enum BLUECOLOR implements DealColor{
COBALT_BLUE, NAVY_BLUE, AQUAMARINE_BLUE
}
enum REDCOLOR implements DealColor{
SCARLET, WINE_RED, MAUVE
}
}
public static void main(String[] args) {
for(Color color : Color.values()){
System.out.print(color.name()+" :");
DealColor[] values = color.getValues();
for(int i = 0; i<values.length;i++){
System.out.print(values[i]+" ");
}
System.out.println();
}
}
}
演示结果:
三、EnumMap 和 EnumSet
这个两个集合是专门针对Enum类而设计的,它们的优势主要体现在性能和速度上,比HashMap和HashSet要快很多,其中最主要的原因就是枚举类的个数是有限的,针对这一有限性使用数组来设计集合。
最后,枚举类的使用和功能都比较简单,但是它的实现原理却比较复杂,枚举类在使用时做了很多性能方面的优化工作,其中的设计思想和实现方法是非常值得我们去借鉴的。因为时间有限,此处只做功能上的阐述。