【Java】Enumeration Class 枚举类

枚举类 enum 对象是有限的确定的、属于类的(静态的)

适合定义一组常量

 

例如固定的一些事物:

- 季节

- 性别

- 状态

 

自定义枚举类的使用

public class EnumerationTest {
    /*
        枚举类的使用
        1 类的对象有限,确定的
        2 适合定义一组常量
        3 枚举只有一个对象就可以是单例模式的实现方式
     */
    public static void main(String[] args) {
        EnumerationClass status01 = EnumerationClass.STATUS01;
        System.out.println(status01);
        Integer statusID = status01.getStatusID();
    }
}

//  JDK5.0之前,编写我们自己的枚举类
//  JDK5.0之后,使用enum关键字声明枚举类
class EnumerationClass{
    // 自定义枚举类
    private String statusName;
    private Integer statusID;

    // 私有化构造器,不可调用new 创建
    private EnumerationClass(String statusName,Integer statusID){
        this.statusName = statusName;
        this.statusID = statusID;
    }

    // 声明我们的对象常量,这些对象允许被公开访问 public
    public static final EnumerationClass STATUS01 = new EnumerationClass("枚举类状态对象01",1001);
    public static final EnumerationClass STATUS02 = new EnumerationClass("枚举类状态对象02",1002);
    public static final EnumerationClass STATUS03 = new EnumerationClass("枚举类状态对象03",1003);
    public static final EnumerationClass STATUS04 = new EnumerationClass("枚举类状态对象04",1004);

    // 属性的setter & getter
    public String getStatusName() { return statusName; }
    public void setStatusName(String statusName) { this.statusName = statusName; }
    public Integer getStatusID() { return statusID; }
    public void setStatusID(Integer statusID) { this.statusID = statusID; }

    // toString 方法
    @Override
    public String toString() {
        return "EnumerationClass{" +
                "statusName='" + statusName + '\'' +
                ", statusID=" + statusID +
                '}';
    }
}

 

使用Enum声明枚举类:

public enum EnumerationClass {
    //  枚举类的枚举对象,必须在第一行声明,如果没有,也要使用一个分号结束,表示没有枚举对象
    STATUS01("状态对象01",1001),
    STATUS02("状态对象02",1002),
    STATUS03("状态对象03",1003),
    STATUS04("状态对象04",1004);

    //  枚举对象也可以声明字段
    private String enumName;
    private Integer enumID;

    // 枚举对象也可以有构造器,这个构造器不可被外界访问
    EnumerationClass(String enumName, Integer enumID) {
        this.enumName = enumName;
        this.enumID = enumID;
    }
    
    // 也可以声明setter & getter
    public String getEnumName() { return enumName; }
    public void setEnumName(String enumName) { this.enumName = enumName; }
    public Integer getEnumID() { return enumID; }
    public void setEnumID(Integer enumID) { this.enumID = enumID; }
    
    @Override
    public String toString() {
        return "EnumerationClass{" +
                "enumName='" + enumName + '\'' +
                ", enumID=" + enumID +
                '}';
    }
}

 

 Enum枚举父类 的常见方法

 

- values() 返回枚举类的对象数组,用来遍历所有枚举对象

- valueOf(String str)方法 ,获取字符串转换为枚举类的对象,字符串必须是对象的标识符,如果枚举类没有此字符枚举项,则发生不合理的参数异常

- toString()默认返回枚举对象名称

public class EnumerationTest {
    public static void main(String[] args) {

        // 根据参数名字返回枚举类的对应标识符的枚举对象,如果没有报不合理的参数异常
        EnumerationClass status04 = EnumerationClass.valueOf("STATUS04");
        System.out.println(status04);

        // 返回这个枚举类的所有枚举对象 是一个对象数组
        EnumerationClass[] instances = EnumerationClass.values();

        // 遍历所有枚举对象 ,可以查看有哪些枚举项
        for (EnumerationClass ec:instances) {
            System.out.println(ec); // 调用的toString方法 默认返回对象的表示名称,可以重写
        }
    }
}

 

使用枚举类实现接口

- 因为enum枚举类已经继承了Enum枚举总抽象类,和Object原型类,不能在继承任何类了

- 但可以实现接口

public enum EnumerationClass implements Plug{
    //  枚举类的枚举对象,必须在第一行声明,如果没有,也要使用一个分号结束,表示没有枚举对象
    STATUS01("状态对象01",1001),
    STATUS02("状态对象02",1002),
    STATUS03("状态对象03",1003),
    STATUS04("状态对象04",1004);

    //  枚举对象也可以声明字段
    private String enumName;
    private Integer enumID;

    // 枚举对象也可以有构造器,这个构造器不可被外界访问
    EnumerationClass(String enumName, Integer enumID) {
        this.enumName = enumName;
        this.enumID = enumID;
    }

    // 也可以声明setter & getter
    public String getEnumName() { return enumName; }
    public void setEnumName(String enumName) { this.enumName = enumName; }
    public Integer getEnumID() { return enumID; }
    public void setEnumID(Integer enumID) { this.enumID = enumID; }

    @Override
    public String toString() {
        return "EnumerationClass{" +
                "enumName='" + enumName + '\'' +
                ", enumID=" + enumID +
                '}';
    }

    @Override
    public void plugMethod() {
        System.out.println("实现接口方法!!!");
    }
}

// 声明一个接口
interface Plug{
    void plugMethod(); // 接口方法
}

除了在枚举类里面实现同一的接口方法

也可以匿名实现

public enum EnumerationClass implements Plug{
    //  枚举类的枚举对象,必须在第一行声明,如果没有,也要使用一个分号结束,表示没有枚举对象
    STATUS01("状态对象01",1001){
        
        @Override
        public void plugMethod(){
            System.out.println("匿名实现接口方法1");
        }
    },
    STATUS02("状态对象02",1002){

        @Override
        public void plugMethod(){
            System.out.println("匿名实现接口方法2");
        }
    },
    STATUS03("状态对象03",1003){

        @Override
        public void plugMethod(){
            System.out.println("匿名实现接口方法3");
        }
    },
    STATUS04("状态对象04",1004){

        @Override
        public void plugMethod(){
            System.out.println("匿名实现接口方法4");
        }
    };

    //  枚举对象也可以声明字段
    private String enumName;
    private Integer enumID;

    // 枚举对象也可以有构造器,这个构造器不可被外界访问
    EnumerationClass(String enumName, Integer enumID) {
        this.enumName = enumName;
        this.enumID = enumID;
    }

    // 也可以声明setter & getter
    public String getEnumName() { return enumName; }
    public void setEnumName(String enumName) { this.enumName = enumName; }
    public Integer getEnumID() { return enumID; }
    public void setEnumID(Integer enumID) { this.enumID = enumID; }

    @Override
    public String toString() {
        return "EnumerationClass{" +
                "enumName='" + enumName + '\'' +
                ", enumID=" + enumID +
                '}';
    }

   
}

// 声明一个接口
interface Plug{
    void plugMethod(); // 接口方法
}

 

posted @ 2020-04-20 11:42  emdzz  阅读(634)  评论(0编辑  收藏  举报