1枚举的本质
java.lang.Enum类声明
public abstract class Enum<E extends Enum<E>>
implements Comparable<E>, Serializable { ... }
新建一个 ColorEn.java 文件,内容如下:
package io.github.dunwu.javacore.enumeration;
public enum ColorEn {
RED,YELLOW,BLUE
}
执行 javac ColorEn.java 命令,生成 ColorEn.class 文件。
然后执行 javap ColorEn.class 命令,输出如下内容:
Compiled from "ColorEn.java"
public final class io.github.dunwu.javacore.enumeration.ColorEn extends java.lang.Enum<io.github.dunwu.javacore.enumeration.ColorEn> {
public static final io.github.dunwu.javacore.enumeration.ColorEn RED;
public static final io.github.dunwu.javacore.enumeration.ColorEn YELLOW;
public static final io.github.dunwu.javacore.enumeration.ColorEn BLUE;
public static io.github.dunwu.javacore.enumeration.ColorEn[] values();
public static io.github.dunwu.javacore.enumeration.ColorEn valueOf(java.lang.String);
static {};
}
枚举的本质是 java.lang.Enum 的子类。
尽管 enum 看起来像是一种新的数据类型,事实上,enum 是一种受限制的类,并且具有自己的方法。枚举这种特殊的类因为被修饰为 final,所以不能继承其他类。
定义的枚举值,会被默认修饰为 public static final ,从修饰关键字,即可看出枚举值本质上是静态常量。
在 enum 中,提供了一些基本方法:
values():返回 enum 实例的数组,而且该数组中的元素严格保持在 enum 中声明时的顺序。
name():返回实例名。
ordinal():返回实例声明时的次序,从 0 开始。
getDeclaringClass():返回实例所属的 enum 类型。
equals() :判断是否为同一个对象。
可以使用 == 来比较enum实例。
此外,java.lang.Enum实现了Comparable和 Serializable 接口,所以也提供 compareTo() 方法。
package com.zs.enums;
/**
* @author zhaoshuai06 <zhaoshuai06@kuaishou.com>
* Created on 2021-06-10
*/
public class EnumMethodDemo {
enum Color {RED, GREEN, BLUE;}
enum Size {BIG, MIDDLE, SMALL;}
public static void main(String args[]) {
System.out.println("=========== Print all Color ===========");
for (Color c : Color.values()) {
System.out.println(c + " ordinal: " + c.ordinal());
}
System.out.println("=========== Print all Size ===========");
for (Size s : Size.values()) {
System.out.println(s + " ordinal: " + s.ordinal());
}
Color green = Color.GREEN;
System.out.println("green name(): " + green.name());
System.out.println("green getDeclaringClass(): " + green.getDeclaringClass());
System.out.println("green hashCode(): " + green.hashCode());
System.out.println("green compareTo Color.GREEN: " + green.compareTo(Color.GREEN));
System.out.println("green equals Color.GREEN: " + green.equals(Color.GREEN));
System.out.println("green equals Size.MIDDLE: " + green.equals(Size.MIDDLE));
System.out.println("green equals 1: " + green.equals(1));
System.out.format("green == Color.BLUE: %b\n", green == Color.BLUE);
}
}
2枚举的使用
package com.zs.enums;
import java.util.HashMap;
import java.util.Map;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* @author zhaoshuai06 <zhaoshuai06@kuaishou.com>
* Created on 2021-06-10
*/
@Getter
@AllArgsConstructor
public enum LoveCodeEnumDemo {
INVOLVED(520, "热恋中"),
LOVELORN(555, "失恋中"),
SINGLETON(111, "单身中"),
MARRIAGE(222, "婚姻中");
private Integer code;
private String desc;
public static final Map<Integer, LoveCodeEnumDemo> loveCodeEnumMap = new HashMap<>();
static {
for (LoveCodeEnumDemo value : LoveCodeEnumDemo.values()) {
loveCodeEnumMap.put(value.getCode(), value);
}
}
public static final LoveCodeEnumDemo getLoveCodeEnumByCode(Integer code) {
LoveCodeEnumDemo loveCodeEnum = loveCodeEnumMap.getOrDefault(code, null);
return loveCodeEnum;
}
}
class Test {
public static void main(String[] args) {
System.out.println(LoveCodeEnumDemo.INVOLVED.getDesc());
}
}