================ ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ================
程序代码:
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 }
================ ASP.Net+Android+IOS开发、.Net培训、期待与您交流!================
详细请查看:http://edu.csdn.net