Java_枚举类

枚举类

枚举类不出来的时候只能如下写代码

 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 }
心再坚强也不要独自飞翔
原文地址:https://www.cnblogs.com/LoganChen/p/6362269.html