java枚举

枚举定义了一个变量的可使用范围,能够使程序可读性提高。

一个简单的枚举类:

enum Week {
    Mon,Tue,Wed,Thu,Fri,Sta,Sun;

}
  1. enum和class、interface的地位一样
  2. 使用enum定义的枚举类默认继承了java.lang.Enum,而不是继承Object类。枚举类可以实现一个或多个接口。
  3. 枚举类的所有实例都必须放在第一行展示,不需使用new 关键字,不需显式调用构造器。自动添加public static final修饰。
  4. 使用enum定义、非抽象的枚举类默认使用final修饰,不可以被继承。
  5. 枚举类的构造器只能是私有的。

枚举类内也可以定义属性和方法,可是是静态的和非静态的。

enum Week {
    Mon("星期一"),Tue("星期二"),Wed("星期三"),Thu("星期四"),Fri("星期五"),Sta("星期六"),Sun("星期日");
    
    private final String name;
    
    private Week(String name){
        this.name=name;
        
    }
    public String getName() {
        return name;
    }
}

由于这里是有参的构造函数,所以在定义枚举实例时要传入参数,因为没有显式申明无参构造器,只能调用有参数的构造器。

构造器需定义成私有的,这样就不能在别处申明此类的对象了。枚举类通常应该设计成不可变类,它的Field不应该被改变,这样会更安全,而且代码更加简洁。所以我们将Field用private final修饰。

枚举类中有四种方法:

  1. valueOf()返回指定名字、给定类的枚举常量。
  2. toSting()返回枚举常量名。
  3. ordinal() 返回枚举常量在enum声明中的位置,位置从0开始计数。
  4. compareTo(E other) 如果枚举常量出现在other之前,则返回一个负值;如果this==other,则返回0;否则返回正值。枚举常量出现次序在enum声明中给出。

对上面的星期的枚举类,我们写个测试函数:

public class TestWeek{
    public static void main(String[] args) {
        Week w = Enum.valueOf(Week.class, "Wed");//返回Week枚举类中Wed的枚举常量
        System.out.println(w);
        System.out.println(Week.Wed.toString());//返回枚举常量名
        System.out.println(Week.Wed.ordinal());//返回Wed在枚举类中的位置
        Week[] week = Week.values();//返回一个包含枚举值的数组
        for(Week value:week){
            System.out.println(value);
        }
        
    }      
    
}

枚举的应用

在网上查找了一些枚举值的应用

  1. 检查权限之类的,如一个经理、员工、顾客对一个工具的使用权限,一般用枚举来处理     因为这样子可以用来控制传入判断的参数只能够是该枚举类型的数,从而限制传入的参数。
  2. A系统调用B系统服务,可能会抛出异常,那么异常就可以使用枚举类型,这样A系统就可以不管B系统怎么添加异常类型。A系统都可以捕获所有的异常。

1.

enum AccessRight{
    MANAGER,DEPARMENT,EMPLOYEE;
}
public class AccessControl {
   public static boolean checkRight(AccessRight access){
       if(access == AccessRight.MANAGER){
           return true;
       }else if(access == AccessRight.DEPARMENT){
           return false;
       }else{ 
           return false;
       }
   }
   public static void main(String[] args) {
      System.out.println(checkRight(AccessRight.DEPARMENT));
   }
}

2.

enum MYException{
     //枚举类型的值必须在枚举类起始部分定义
     NAMEISNULL("NAMEISNULL","姓名为空"),//姓名为空异常
     AGEISNULL("AGEISNULL","年龄为空");//年龄为空异常
    //枚举类型也是一种类,可以有数据域。
    private String exceptionCode;//异常代码
    private String exceptionDesc;//异常描述
    //枚举类型构造方法必须为private以防在枚举类型外创建对象,默认也是private
    private MYException(String exceptionCode, String exceptionDesc) {
        this.exceptionCode = exceptionCode;
        this.exceptionDesc = exceptionDesc;
    }
    public String getExceptionCode() {
        return exceptionCode;
    }
    public String getExceptionDesc() {
        return exceptionDesc;
    }

}
public class EnumDemo {
     public static void main(String[] args) {
        //直接使用枚举类型
        System.out.println(MYException.NAMEISNULL.getExceptionCode());
        //返回所有Exception类型的对象
        MYException es[] = MYException.values();
        for(MYException e :es){
          //toString返回枚举类型的对象名
          System.out.println(e.toString());
          //ordinal 返回枚举类型对象在枚举类中的位置
          System.out.println(e.ordinal());
       }
    }
}

 

posted @ 2017-03-28 13:15  爱姿病  阅读(348)  评论(0编辑  收藏  举报