枚举类:有限而固定的类,使用enum关键字定义。
一个Java源文件中最多只能定义一个public访问权限的枚举类。
1、可实现一个或多个接口,默认集成了java.lang.Enum类(实现java.lang.Serializable和java.lang.Comparable两个接口),不能显示继承其他父类;
2、非抽象的枚举类默认使用final修饰,不能被继承;
3、构造器只能使用private 访问控制符(默认);
4、枚举类的所有实例必须在枚举类的第一行显示列出,否则这个枚举类永远都不能产生实例,实例默认是public static final修饰;
5、values()方法可以遍历所有的枚举值
java.lang.Enum类中包含的方法:
1、int compareTo(E o):与指定枚举对象比较顺序,同一个枚举实例只能与相同类型的枚举实例进行比较。如果该美剧对象位于指定枚举对象之后,则返回正整数;如果位于指定枚举对象之前,则返回负整数,否则返回零。
2、String name():返回枚举实例的名称,该名称就是定义枚举类时列出的所有枚举值之一。
3、int ordinal():返回枚举值在枚举类中的索引值(即 枚举值在枚举声明中的位置)。
4、String toString():返回枚举常量的名称,与name方法相似,此方法更常用
5、public static<T extends Enum<T>> T valueOf(Class<T> enumType, String name)>:用于返回指定枚举类中指定名称的枚举值
1 public class GenderTest 2 { 3 public static void main(String[] args) 4 { 5 Gender g = Gender.valueOf("FEMALE"); 6 g.setName("女"); 7 System.out.println(g + "代表:" + g.getName()); 8 //此时设置name 值时将会提示参数错误 9 g.setName("男"); 10 System.out.println(g + "代表:" + g.getName()); 11 } 12 }
1 public enum Gender 2 { 3 MALE,FEMALE; 4 private String name; 5 public void setName(String name) 6 { 7 switch (this) 8 { 9 case MALE: 10 if (name.equals("男")) 11 { 12 this.name = name; 13 } 14 else 15 { 16 System.out.println("参数错误"); 17 return; 18 } 19 break; 20 case FEMALE: 21 if (name.equals("女")) 22 { 23 this.name = name; 24 } 25 else 26 { 27 System.out.println("参数错误"); 28 return; 29 } 30 break; 31 } 32 System.out.println("我是参数错误时,不加17和28行return语句的测试"); 33 } 34 public String getName() 35 { 36 return this.name; 37 } 38 }
小插曲:return语句可用于结束方法,当发生参数错误的时候,要立马结束setName()方法。
改进:枚举类通常应该设计成不可变类,所以建议将枚举类的成员变量都使用private final修饰,final修饰则必须在构造器里为这些成员变量指定初始值,因而要为枚举类显示定义带参数的构造器。
1 public enum Gender 2 { 3 //此处的枚举值必须调用对应的构造器来创建 4 MALE("男"),FEMALE("女"); 5 //上面一行代码实际上等同于如下两行代码,但是为啥有错呢。。。 6 // public static final Gender MALE = new Gender("男"); 7 // public static final Gender FEMALE = new Gender("女"); 8 private final String name; 9 //枚举类的构造器只能使用private 修饰 10 private Gender(String name) 11 { 12 this.name = name; 13 } 14 public String getName() 15 { 16 return this.name; 17 } 18 19 }
附上对Enum讲解详细的网址:http://www.ibm.com/developerworks/cn/java/j-lo-enum/