枚举类型

Posted 回忆成长

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了枚举类型相关的知识,希望对你有一定的参考价值。

创建一个枚举类的时候默认继承Enum,所以无法再继承其他的类,但是可以实现多个接口。而且编译器编译的时候会将枚举类标记为final所以也不会被继承,以下是一个最基础的枚举类

package cn.ghaien.demo;
public enum EnumDemo1 {
    OBJECT_1, OBJECT_2, OBJECT_3
}

使用javac编译后

package cn.ghaien.demo;

public enum EnumDemo1 {
    OBJECT_1,
    OBJECT_2,
    OBJECT_3;

    private EnumDemo1() {
    }
}

再使用javap进行反编译

public final class cn.ghaien.demo.EnumDemo1 extends java.lang.Enum<cn.ghaien.demo.EnumDemo1> {
  public static final cn.ghaien.demo.EnumDemo1 OBJECT_1;
  public static final cn.ghaien.demo.EnumDemo1 OBJECT_2;
  public static final cn.ghaien.demo.EnumDemo1 OBJECT_3;
  public static cn.ghaien.demo.EnumDemo1[] values();
  public static cn.ghaien.demo.EnumDemo1 valueOf(java.lang.String);
  static {};
}

枚举类常用的方法


  • name:获取某个实例声明时的名称
  • ordinal:获取某个实例在枚举类中声明的序号(从0开始)
  • compareTo:通过实例在枚举类中的声明顺序进行比较大小
  • getDeclaringClass:返回某个实例的Class对象
  • valueOf:Enum中的方法需要传两个参数一个是枚举类的Class对象一个是实例的名称,返回该实例对象
  • equal:比较是否是同一个对象,即使用‘==’比较
  • toString:返回实例的名称
    System.out.println(EnumDemo1.OBJECT_1.name());
    System.out.println(EnumDemo1.OBJECT_2.ordinal());
    System.out.println(EnumDemo1.OBJECT_3.getDeclaringClass());
    System.out.println(EnumDemo1.OBJECT_2.compareTo(EnumDemo1.OBJECT_3));
    System.out.println(EnumDemo1.OBJECT_1.equals(EnumDemo1.OBJECT_2));
    System.out.println(EnumDemo1.valueOf(EnumDemo1.class, "OBJECT_2"));
    /** output
     *  OBJECT_1
     *  1
     *  class cn.ghaien.demo.EnumDemo1
     *  -1
     *  false
     *  OBJECT_2
     */

    以上这些方法都是Enum类中的方法,从上面反编译后的代码可以看出,当创建一个枚举类的时候编译器会自动帮你添加以下两个方法

  • values:返回枚举类中所有实例的数组
  • valueOf:该方法只有一个字符串类型的参数, 返回名称为该参数的实例
    EnumDemo1[] values = EnumDemo1.values();
    for (EnumDemo1 value : values)
        System.out.print(value.name() + " ");
    System.out.println("\n" + EnumDemo1.valueOf("OBJECT_1"));
    /**
     * OBJECT_1 OBJECT_2 OBJECT_3
     * OBJECT_1 
     */

枚举类与switch


在switch中使用enum,是enum提供的一个非常有用的功能。一般来说在switch中只能使用整数值,而枚举类中的每个实例都具有一个整数值的次序,即通过ordinal方法获得,使得enum可以与switch结合使用

enum Color {
    RED, YELLOW
}
public class TrangeColor {
    Color color = Color.RED;
    public void change() {
        switch(color) {   
            case RED: //这里不能使用Color.RED
                color = Color.YELLOW;
                break;
            case YELLOW:
                color = Color.RED;
                break;
        }
    }
}            

枚举类中重载构造器


与普通的类一样,编译器会帮我们自动生成一个默认的无参构造器,而且我们也可以重载多个构造器。在日常的开发中我们经常需要将某个状态值与状态信息进行绑定,我们就可以通过在枚举类中重载构造器来实现这个功能,代码如下

public enum StatusEnum {
    INVALID(1, "失效"),
    VALID(2, "有效");
    private Integer value;
    private String msg;
    StatusEnum(Integer value, String msg) {
        this.value = value;
        this.msg = msg;
    }
    public static String getMsgByValue(Integer value) {
        StatusEnum[] status = StatusEnum.values();
        for (StatusEnum statu : status) {
            if (statu.value.equals(value)) {
                return statu.msg;
            }
        }
        throw new RuntimeException("错误的value值");
    }
}

通过调用getMsgByValue方法我们就可以获取某个状态值对应的状态信息,当然我们也可以直接将实例的名称命名为状态的信息,这样我们就可以只需要含有一个参数的构造器来实现这个功能

注意:若想在枚举类中定义属性或方法,那必须在枚举实例序列的最后一个后面加上‘;’,并且只能放在在枚举实例序列的后面,否则会直接编译错误。枚举类中的构造器只能在其内部创建实例。

枚举类与抽象方法


在枚举类中可以直接定义抽象方法,但是每个实例必须得实现所有的抽象方法,否则编译错误,枚举类中的实例实现抽象方法的代码如下

public enum ColorEnum {
    RED {
        public String getColor() { return "红色"; }
    },
    GREEN {
        public String getColor() { return "绿色"; }
    },
    BALCK {
        public String getColor() { return "黑色"; }
    };
    abstract String getColor();
}

 

以上是关于枚举类型的主要内容,如果未能解决你的问题,请参考以下文章

Java 枚举类的基本使用

C/C++ 中enum枚举量的介绍:介绍enum枚举量在C/C中的作用和使用方法

Java中枚举的写法和用法

JAVA String类型如何 转 枚举类型,最好有点代码可得清楚点

在代码片段中包含类型转换

使用代码段遍历,枚举类型Enum