黑马程序员-Java基础加强,枚举类属性、方法、构造器

程序代码:

 

 1 package com.king.testenum;
 2 
 3  
 4 
 5 public enum Gender {
 6 
 7 MALE,FEMALE;
 8 
 9 //定义一个public访问权限的name属性
10 
11 public String name;
12 
13 }
14 
15 使用该枚举类的程序代码:
16 
17 package com.king.testenum;
18 
19  
20 
21 public class GenderTest {
22 
23  
24 
25 /**
26 
27  * @author 王者黑桃
28 
29  */
30 
31 public static void main(String[] args) {
32 
33 // 通过Enum的valueOf方法来获取指定枚举类的枚举值
34 
35 Gender g=Enum.valueOf(Gender.class, "FEMALE");
36 
37 //直接为枚举值的属性赋值
38 
39 g.name="女";
40 
41 //直接访问枚举值的属性值
42 
43 System.out.println(g+"代表:"+g.name);
44 
45  
46 
47 }
48 
49  
50 
51 }

 

上面程序使用Gender枚举类时,与使用普通类没有太大区别,区别只是产生Gender对象的方式不同,枚举类的实例只能是枚举值,而不是随意的通过new来创建对象。

正如前面提到的,java应该把所有类设计成封装性良好的类,所以不应该直接访问Gender枚举类的name属性,而是应该通过方法来控制name属性值的访问。为了避免FEMALE为男的情况,改进后的Gender枚举类程序代码:

 

  1 package com.king.testenum;
  2 
  3  
  4 
  5 public enum Gender {
  6 
  7 MALE,FEMALE;
  8 
  9 //修改name属性为private,从而避免其他程序直接访问该name属性
 10 
 11 private String name;
 12 
 13 //通过定义setName方法来修改Gender实例的name属性
 14 
 15 public void setName(String name){
 16 
 17 switch(this){
 18 
 19 case MALE:
 20 
 21 //只能将MALE枚举值的name属性设置为男
 22 
 23 if(name.equals("男")){
 24 
 25 this.name=name;
 26 
 27 }else{
 28 
 29 System.out.println("参数错误");
 30 
 31 return;
 32 
 33 }
 34 
 35 break;
 36 
 37 case FEMALE:
 38 
 39 //只能将FEMALE枚举值的name属性设置为女
 40 
 41 if(name.equals("女")){
 42 
 43 this.name=name;
 44 
 45 }else{
 46 
 47 System.out.println("参数错误");
 48 
 49 return;
 50 
 51 }
 52 
 53 break;
 54 
 55 }
 56 
 57 }
 58 
 59 public String getName(){
 60 
 61 return this.name;
 62 
 63 }
 64 
 65 }
 66 
 67 使用该枚举类的程序代码:
 68 
 69 package com.king.testenum;
 70 
 71  
 72 
 73 public class GenderTest {
 74 
 75  
 76 
 77 /**
 78 
 79  * @author 王者黑桃
 80 
 81  */
 82 
 83 public static void main(String[] args) {
 84 
 85 // 通过Enum的valueOf方法来获取指定枚举类的枚举值
 86 
 87 Gender g=Enum.valueOf(Gender.class, "FEMALE");
 88 
 89 g.setName("女");
 90 
 91 System.out.println(g+"代表:"+g.name);
 92 
 93 //此时设置name属性将会提示参数错误
 94 
 95 g.setName("男");
 96 
 97 System.out.println(g+"代表:"+g.name);
 98 
 99 }
100 
101  
102 
103 }

 

 

 

实际上这种做法依然不够好,枚举类通常设置为不可变类,也就是说枚举类的属性值不应该允许改变,这样更安全,代码更简洁。为此我们应该将枚举类的属性都使用private final修饰。那么也必须在构造器里为这些属性指定初始值(或者在定义属性时指定默认值,或者在初始化块中指定初始值,但这两种情况并不常见),因此应该为枚举显式定义带参数的构造器。则响应的列出枚举值时,也必须对应的传入参数。

程序代码:

 

 1 package com.king.testenum;
 2 
 3  
 4 
 5 public enum Gender {
 6 
 7 //此处的枚举值必须调用对应构造器来创建
 8 
 9 MALE("男"),FEMALE("女");
10 
11 /**
12 
13  * 等同于
14 
15  * public static final Gender MALE=new Gender("男");
16 
17  * public static final Gender FEMALE=new Gender("女");
18 
19  * */
20 
21 private String name;
22 
23 //枚举类的构造器只能使用private修饰
24 
25 private Gender(String name){
26 
27 this.name=name;
28 
29 }
30 
31 public String getName(){
32 
33 return this.name;
34 
35 }
36 
37 }

 

 

posted @ 2014-01-05 16:42  code4a  阅读(254)  评论(0编辑  收藏  举报