J2SE1.5新增了一个enum关键字,用以定义枚举类。从某种程度上来看,enum关键字和class、interface关键字的作用大致相似。
枚举类是一种特殊的类,它一样可以有自己的方法和属性,可以实现一个或者多个接口,也可以定义自己的构造器。一个java源文件中最多只能定义一个public访问权限的枚举类,且该源文件也必须和该枚举类的类名相同。
但枚举类终究不是普通类,它与普通类有如下简单区别:
(1)枚举类可以实现一个或者多个接口,使用enum定义的枚举类默认继承了java.lang.Enum类,而不是继承Object类。其中java.lang.Enum类实现了java.lang.Serializable和java.lang.Comparable两个接口。
(2)枚举类的构造器只能使用private访问控制符,如果省略了其构造器的访问控制符,则默认使用private修饰:如果强制指定访问控制符,则只能指定private修饰符。
(3)枚举类的所有实例(枚举值)必须在类中显示列出,否则这个枚举类将永远都不能产生实例。列出这些实例时,系统会自动添加public static final修饰,无需程序员显式添加。
(4)所有枚举类都提供了一个values方法,该方法可以很方便地遍历所有的枚举值。
public enum Gender
{
MALE("男"),FEMALE(“女”);
private String name;
private Gender(String name)
{
this.name=name;
}
public void getName()
{
return this.name;
}
}
从上面程序可以看出,当我们使用Gender类创建了一个Gender(String name)构造器之后列出枚举值应该采用粗体字所示代码来完成。也就是说,在枚举类中列出枚举值时,实际上就是调用构造器创建枚举类对象,只是这里无需要使用new关键字,也无需显式调用构造器。上面的粗体字代码其实等同于如下两行代码:public static final Gender MALE=new Gender("男");public static final Gender FEMALE=new Gender("女");public class TestGender
{
public static void main(String [] args)
{
//通过Enum的valueOf方法来获取指定枚举类的枚举值(实例)
Gender g=Enum.valuof(Gender.class,"FEMALE");
g.setName("女");
System.out.println(g+"代表:"+g.getName());
}
}
上面加粗的代码使用了Enum的valueOf方法来获取指定的枚举类的枚举值,枚举类与普通类的区别之一是枚举类产生对象的方式和普通类不同,枚举类的实例只能是枚举值,而不是随意地通过new来创建枚举类对象。从上面介绍中知道,所有的枚举类都继承了java.lang.Enum类,所以枚举类可以直接使用java.lang.Enum类中所包含的方法。java.lang.Enum类中提供了如下几个方法:int compareTo(E o): 该方法用于与指定枚举对象比较顺序,同一个枚举实例只能与相同类型的枚举实例进行比较。如果该枚举对象位于指定枚举对象之后,则返回正整数;如果该枚举对象位于指定枚举对象之前,则返回负整数,否则返回零。String name(): 返回此枚举实例的名称,这个名字就是定义枚举类时列出的所有枚举值之一。于此方法相比,大多数程序员应该优先考虑使用toString()方法,因为toString()方法返回更加用户友好的名称。int ordinal(): 返回枚举值在枚举类中的索引值(就是枚举值在枚举声明中的位置,第一个枚举值的索引值为零)。String toString(): 返回常量的名称,大致上与name方法相似,但toString()方法更常用。public static <T extends Enum<T>>T valueOf(Class<T> enumType, String name): 这是一个静态方法,用于返回指定枚举类中指定名称的枚举值。名称必须与在就枚举类中声明枚举值时所用的标识符完全匹配,不允许使用额外的空白字符。