首先,我们总结一下枚举类的好处,再一层层去研究枚举类的用法:
好处1:如果使用static final属性而不使用枚举的话,可能在代码中出现强行去set属性的写法,在这里单独提出来,大家肯定会觉得不会发生这样的问题,现实开发中,是可能出现的,这时候就会报错,如果使用枚举类的话,因为枚举类无法通过外部去set,所以可以杜绝这样的情况。
好处2:static final扩展性较差,枚举的每一个属性我们都可以扩展属性,重写方法等等。
好处3:可以通过switch去判断,代码的简洁性更高
使用:
最最最最简单级:
先简单写一个枚举类,用enum做关键字声明这个类,然后写属性,注意这里要大写,之间用逗号隔开,这里如果后面没有内容,最后面的分号是可以不加的,但是我们统一规范,加上这个分号。
public enum Number {
ONE,TWO,THREE,FOUR;
}
然后我们写一个测试类
@Test
public void test01() {
Number one = Number.ONE;
}
这里我们看出,直接枚举类.属性就可以使用,我们这里需要注意一个细节,返回值是一个类,所以我们上面说的所有枚举类的属性都是错误的说法,实际上它是一个类,一个Number类,也就我们在枚举类里面其实是定义了一个又一个的新类。
简单级:
我们得到了一个Number类,我们自然就会去想着,调用一下它的方法:
一眼看过去,大多数都是我们熟悉的,除了三个方法,name(),ordinal(),compareTo()。我们没有主动定义过他们。感兴趣的可以深究一下源码,这里直接就说结论了。
public void test01() {
//name就是枚举类里面定义的属性的名称
System.out.println(Number.ONE.name()); //ONE
System.out.println(Number.TWO.name()); //TWO
//ordinal就是枚举类里面对应属性的位置,排在第几位,从0开始
System.out.println(Number.ONE.ordinal()); // 0
System.out.println(Number.THREE.ordinal()); //2
// compareTo 就是用前面的一个枚举的ordinal去减后面的ordinal
System.out.println(Number.ONE.compareTo(Number.ONE)); // 0
System.out.println(Number.ONE.compareTo(Number.THREE)); //-2
System.out.println(Number.FOUR.compareTo(Number.ONE)); // 3
}
入门级:
上面我们讲的都是最基本的用法,接下来我们继续研究一下,枚举类的可扩展性。既然我们都知道在枚举类里面,我们其实是定义了一个又一个新的类。类的构造方法有无参和有参,我们只看见了无参,那么可以实现有参构造吗,答案是可以的,这就是枚举的可扩展性之一。一个Number类无法满足我们的需求,有人看不懂大写的单词,有的只会看中文,更有甚者,只认识数字,所以我们需要给他们展示小写的单词,中文和数字。我们来改写一下代码:
public enum Number {
ONE("one","一",1),
TWO("two","二",2),
THREE("three","三",3),
FOUR("four","四",4);
// 定义示例变量,这个才是Number类里面真正的属性
private String lowCase; //小写
private String chinese; //中文
private Integer digit; //数字
//构造函数,这里只能用private修饰
//注意,这里只能同时存在一种构造函数,因为目前是有参,所以我们得把枚举类,也就是上面的ONE,TWO也改成有参。
private Number(String lowCase,String chinese,Integer digit) {
this.lowCase = lowCase;
this.chinese = chinese;
this.digit = digit;
}
//getter/setter
public String getLowCase() {
return lowCase;
}
public String getChinese() {
return chinese;
}
public Integer getDigit() {
return digit;
}
public void setLowCase(String lowCase) {
this.lowCase = lowCase;
}
public void setChinese(String chinese) {
this.chinese = chinese;
}
public void setDigit(Integer digit) {
this.digit = digit;
}
}
这样,我们就得到了一个全新的Number枚举类,它具有扩展的属性。我们再来测试一下它扩展后的属性
public void test02() {
System.out.println(Number.FOUR.name()); //FOUR 没有变
System.out.println(Number.FOUR.ordinal());// 3 没有变
System.out.println(Number.ONE.getLowCase()); // 在构造的时候传的值 one
System.out.println(Number.TWO.getChinese()); // 二
System.out.println(Number.THREE.getDigit()); // 3
}
那么枚举类仅仅只能扩展属性吗?并不是,他还能扩展方法,我们只需要定义一个抽象方法即可:
public enum Number {
ONE("one","一",1){
@Override
public String getNextNumber() {
return "2";
}
},
TWO("two","二",2) {
@Override
public String getNextNumber() {
return "3";
}
},
THREE("three","三",3) {
@Override
public String getNextNumber() {
// TODO Auto-generated method stub
return "4";
}
},
FOUR("four","四",4) {
@Override
public String getNextNumber() {
// TODO Auto-generated method stub
return "5";
}
};
// 定义示例变量,这个才是Number类里面真正的属性
private String lowCase; //小写
private String chinese; //中文
private Integer digit; //数字
//构造函数,这里只能用private修饰
//注意,这里只能同时存在一种构造函数,因为目前是有参,所以我们得把枚举类,也就是上面的ONE,TWO也改成有参。
private Number(String lowCase,String chinese,Integer digit) {
this.lowCase = lowCase;
this.chinese = chinese;
this.digit = digit;
}
//定义一个抽象方法
public abstract String getNextNumber();
//getter/setter
public String getLowCase() {
return lowCase;
}
public String getChinese() {
return chinese;
}
public Integer getDigit() {
return digit;
}
public void setLowCase(String lowCase) {
this.lowCase = lowCase;
}
public void setChinese(String chinese) {
this.chinese = chinese;
}
public void setDigit(Integer digit) {
this.digit = digit;
}
}
这里我们就不测试了,感兴趣的小伙伴们自己测一下把。
以上就是本篇文章要介绍的东西,基本可以满足日常工作大部分需求了,如果以后有需要,再来做补充。