1.什么是枚举
枚举类型在C#或C++,java,VB等一些计算机编程语言中是一种基本数据类型而不是构造数据类型,而在C语言等计算机编程语言中是一种构造数据类型 。它用于声明一组命名的常数,当一个变量有几种可能的取值时,可以将它定义为枚举类型。
2.早期的枚举和它所存在的问题
/*
* @author WLNSSS
* @time 2018.1.18
* */
public class Test {
//早期没有枚举类的时候,使用这种简单的静态代码来表示枚举
public static int SEASON_SPRING = 1;
public static int SEASON_SUMMER = 2;
public static int SEASON_FALL = 3;
public static int SEASON_WINTER = 4;
}
这种定义的方法十分的简单,但是也存在比较多的问题。
2.1 类型不安全
上面的每个季节实际上是int类型,因此完全可以把它当成整数用,两个季节进行相加,这样的代码也是正确的。
2.2 没有命名空间:
当需要使用季节时,必须在SPRING前使用SEASON_前缀,否则程序可能与其他类中的静态类常量混淆。
2.3 打印输出的意义不明确
当输出某个季节时,例如输出SEASON_SPRING,实际输出的是1,则很难猜测它的含义是什么
3.枚举类入门
Java5新增了一个enum关键字用来定义枚举类。所谓的枚举类也只是一个特殊的类,它有着类的绝大多数的特性
,但是一个java源文件最多只能定义一个public访问权限的枚举类,且该源文件也必须和该枚举类的类名相同。
但是枚举类也仅仅只是特殊的类而已,还是有以下区别的:
3.1
枚举类可以实现一个或多个的接口,使用enum定义的枚举类默认继承了java.lang.Enum类,而不是默认继承
Object类,因此枚举类不能显示继承其他父类。其中java.lang.Enum类实现了java.lang.serializable和
java.lang.Comparable两个接口
3.2
使用enum定义、非抽象的枚举类默认会使用final修饰,因此枚举类不能派生子类。
3.3
枚举类的构造器只能使用private访问控制符
3.4
枚举类的所有实例必须在枚举类的第一行显示列出,否则这个枚举类永远也不能产生实例,列出这些实例,系统
会自动添加public static final 修饰,无须显式添加。
还有枚举类默认提供values()方法,这个方法可以遍历所有枚举类的值。
例如下面定义了一个枚举类:
package emuntest;
public enum SeasonEnum {
SPRING,SUMMER,FALL,WINTER;
}
package emuntest;
public class EnumTest {
public void judge(SeasonEnum s) {
switch (s) {
case SPRING:
System.out.println("spring");
break;
case SUMMER:
System.out.println("summer");
break;
case FALL:
System.out.println("fall");
break;
case WINTER:
System.out.println("winter");
break;
default:;
}
}
public static void main(String[] args) {
for(SeasonEnum s : SeasonEnum.values()) {
System.out.println(s);
}
new EnumTest().judge(SeasonEnum.SPRING);
}
}
4.枚举类也可以有自己的成员变量,方法和函数
例如
package com;
public enum Color {
RED("红色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLO("黄色", 4);
private String name ;
private int index ;
private Color( String name , int index ){
this.name = name ;
this.index = index ;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getIndex() {
return index;
}
public void setIndex(int index) {
this.index = index;
}
}
5.注意事项
抽象枚举类是可以继承的,枚举类使用相对较少。谢谢各位。