zoukankan      html  css  js  c++  java
  • 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());
           }
        }
    }
  • 相关阅读:
    服务管理--systemctl命令
    dd if=/dev/zero of=的含义是什么?Linux 下的dd命令使用详解
    QML与Qt C++ 交互机制探讨与总结
    sync命令
    linux 下shell中if的“-e,-d,-f”是什么意思
    POJ 1936 All in All(模拟)
    POJ 1088 滑雪(记忆化搜索)
    POJ 3280 Cheapest Palindrome(DP 回文变形)
    POJ 3181 Dollar Dayz(高精度 动态规划)
    HDU 1114 Piggy-Bank(完全背包)
  • 原文地址:https://www.cnblogs.com/love-Stefanie/p/6633956.html
Copyright © 2011-2022 走看看