枚举类型
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(); }
以上是关于枚举类型的主要内容,如果未能解决你的问题,请参考以下文章
C/C++ 中enum枚举量的介绍:介绍enum枚举量在C/C中的作用和使用方法