枚举类
枚举类不出来的时候只能如下写代码
1 //Student.java 2 package cn.itcast.enumeration; 3 4 public class Student { 5 private String name; 6 private String grade;//A B C D E 7 public String getName() { 8 return name; 9 } 10 public void setName(String name) { 11 this.name = name; 12 } 13 public String getGrade() { 14 return grade; 15 } 16 public void setGrade(String grade) { 17 if(!grade.matches("[ABCDE]")){ 18 throw new RuntimeException("成绩输入错误"); 19 } 20 this.grade = grade; 21 } 22 }
第17行代码使用了正则表达式。
1 //Test.java 2 package cn.itcast.enumeration; 3 4 public class Test { 5 6 public static void main(String[] args) { 7 // TODO Auto-generated method stub 8 Student s = new Student(); 9 s.setGrade("H"); 10 } 11 }
这个代码有一点不好,就是给赋值了,但是程序运行是才报错。如何让写代码的时候就报错?看如下代码。
1 //Student.java 2 package cn.itcast.enumeration2; 3 4 public class Student { 5 private String name; 6 private Grade grade;//A B C D E 7 public String getName() { 8 return name; 9 } 10 public void setName(String name) { 11 this.name = name; 12 } 13 public Grade getGrade() { 14 return grade; 15 } 16 public void setGrade(Grade grade) { 17 this.grade = grade; 18 } 19 } 20 21 class Grade{ 22 private Grade(){} 23 24 public static Grade A = new Grade(); 25 public static Grade B = new Grade(); 26 public static Grade C = new Grade(); 27 public static Grade D = new Grade(); 28 public static Grade E = new Grade(); 29 }
定义一个自己使用的类,再赋值的时候只能赋指定的值,其他值都报错。
1 //Test.java 2 package cn.itcast.enumeration2; 3 4 public class Test { 5 6 public static void main(String[] args) { 7 // TODO Auto-generated method stub 8 Student s = new Student(); 9 s.setGrade(Grade.A); 10 } 11 }
这种方法太复杂,下面使用枚举,只要三行就能取代21-29行的代码
1 //Student.java 2 package cn.itcast.enumeration3; 3 4 public class Student { 5 private String name; 6 private Grade grade;//A B C D E 7 public String getName() { 8 return name; 9 } 10 public void setName(String name) { 11 this.name = name; 12 } 13 public Grade getGrade() { 14 return grade; 15 } 16 public void setGrade(Grade grade) { 17 this.grade = grade; 18 } 19 } 20 /* 21 class Grade{ 22 private Grade(){} 23 24 public static Grade A = new Grade(); 25 public static Grade B = new Grade(); 26 public static Grade C = new Grade(); 27 public static Grade D = new Grade(); 28 public static Grade E = new Grade(); 29 } 30 */ 31 enum Grade{//也是定义了一个类 32 A,B,C,D,E;//对应的是Grade类的对象 33 }
使用枚举类取代21-29行的代码。
1 package cn.itcast.enumeration3; 2 3 public class Test { 4 5 public static void main(String[] args) { 6 // TODO Auto-generated method stub 7 Student s = new Student(); 8 s.setGrade(Grade.A); 9 } 10 }
这种方法比较好,但是如何在枚举类里面封装更多的信息?看下面的代码
1 //Student.java 2 package cn.itcast.enumeration4; 3 4 public class Student { 5 private String name; 6 private Grade grade;//A B C D E 7 public String getName() { 8 return name; 9 } 10 public void setName(String name) { 11 this.name = name; 12 } 13 public Grade getGrade() { 14 return grade; 15 } 16 public void setGrade(Grade grade) { 17 this.grade = grade; 18 } 19 } 20 /* 21 class Grade{ 22 private Grade(){} 23 24 public static Grade A = new Grade(); 25 public static Grade B = new Grade(); 26 public static Grade C = new Grade(); 27 public static Grade D = new Grade(); 28 public static Grade E = new Grade(); 29 } 30 */ 31 //如何让枚举封装更多的信息(如何让枚举对象拥有自己的属性) 32 enum Grade{//也是定义了一个类 33 A("100-90"),B("89-80"),C("79-70"),D("69-60"),E("59-0");//对应的是Grade类的对象 34 35 private String value; 36 private Grade(String value){ 37 this.value = value; 38 } 39 public String getValue(){ 40 return value; 41 } 42 }
封装成绩的同时,可以封装分数段,增加属性。
1 //Test.java 2 package cn.itcast.enumeration4; 3 4 public class Test { 5 public static void main(String[] args) { 6 // TODO Auto-generated method stub 7 Student s = new Student(); 8 s.setGrade(Grade.A); 9 System.out.println(Grade.A.getValue()); 10 } 11 }
那么如何在枚举类里面封装各自的方法呢?看下面的代码。
1 //Student.java 2 package cn.itcast.enumeration6; 3 4 public class Student { 5 private String name; 6 private Grade grade;//A B C D E 7 public String getName() { 8 return name; 9 } 10 public void setName(String name) { 11 this.name = name; 12 } 13 public Grade getGrade() { 14 return grade; 15 } 16 public void setGrade(Grade grade) { 17 this.grade = grade; 18 } 19 } 20 /* 21 class Grade{ 22 private Grade(){} 23 24 public static Grade A = new Grade(); 25 public static Grade B = new Grade(); 26 public static Grade C = new Grade(); 27 public static Grade D = new Grade(); 28 public static Grade E = new Grade(); 29 } 30 */ 31 //如何让枚举对象拥有自己的属性和各自的方法 32 enum Grade{//也是定义了一个类 33 A("100-90"){ 34 public String toLocalString(){ 35 return "优"; 36 } 37 },B("89-80"){ 38 public String toLocalString(){ 39 return "良"; 40 } 41 },C("79-70"){ 42 public String toLocalString(){ 43 return "中"; 44 } 45 },D("69-60"){ 46 public String toLocalString(){ 47 return "一般"; 48 } 49 },E("59-0"){ 50 public String toLocalString(){ 51 return "差"; 52 } 53 };//对应的是Grade类的对象 54 55 private String value; 56 private Grade(String value){ 57 this.value = value; 58 } 59 public String getValue(){ 60 return value; 61 } 62 public abstract String toLocalString(); 63 }
返回成绩的中文表示。
1 package cn.itcast.enumeration6; 2 3 public class Test { 4 5 public static void main(String[] args) { 6 // TODO Auto-generated method stub 7 Student s = new Student(); 8 s.setGrade(Grade.A); 9 System.out.println(Grade.A.getValue()); 10 System.out.println(Grade.A.toLocalString()); 11 } 12 }
注意:枚举类的对象的方法必须是私有的,不能公有。
枚举类有如下特性:
1.枚举类也是一种特殊的Java类。
2.枚举类中声明的每一个枚举值代表枚举类的一个实例对象。
3.与Java中的普通类一样,在声明枚举类时,也可以声明属性、方法和构造函数,但是枚举类的构造函数必须为室友的(这点不难理解)。
4.枚举类也可以实现接口、或基层抽象类。
5.JDK5中扩展了switch语句,它除了可以接收int、byte、char、short外,还可以接收一个枚举类型。
6.若枚举类只有一个枚举值,则可以当做单态设计模式。
下面这样写也是单态设计模式。
1 enum Demo{ 2 demo; 3 }
枚举类的常用方法
1 public void test(){ 2 //枚举类的常用方法name,valueOf,values 3 String name = "B"; 4 Grade g = Grade.valueOf(name);//把字符串转成枚举对象 5 System.out.println(g.name());//获取枚举对象名称 6 7 Grade gs[] = Grade.values(); 8 for(Grade g1:gs){ 9 System.out.println(g1.name()); 10 } 11 }