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


    ================ 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

  • 相关阅读:
    Ubuntu16.04+cuda9.0+matlab+opencv3.3+caffe服务器配置(问题汇总)
    numpy 实践记录
    qwe框架- CNN 实现
    qwe 简易深度框架
    深度拾遗(08)
    python 环境配置
    Robotframework Web自动化实战课程
    常用javascript代码片段集锦
    AJax跨域请求百度音乐接口数据展示页面
    JavaScript 经典实例收集整理
  • 原文地址:https://www.cnblogs.com/super614508584/p/3506021.html
Copyright © 2020-2023  润新知