前置知识: Java

Java 枚举进阶 EnumSet/EnumMap/枚举单例语法速查手册

1 min入门

Java 枚举进阶 EnumSet/EnumMap/枚举单例语法速查手册 的完整教学讲解。

0. 本节阅读指引(先读这一节)

本篇是「枚举进阶」语法速查手册,按需查阅。

零基础第一遍只读:枚举定义、枚举方法、EnumSet、EnumMap;枚举实现接口、枚举单例遇到再查(单例模式见 071 设计模式)。

前置:034 枚举与注解。

枚举定义

基本写法:简单枚举

public enum <名称> { <常量1>, <常量2> }
// 定义枚举类型
public enum Color { RED, GREEN, BLUE }

基本写法:带字段枚举

public enum <名称> {
  <常量>(<参数>);
  private final <类型> <字段>;
  <名称>(<类型> <参数>) { this.<字段> = <参数>; }
}
// 枚举带属性与方法
public enum Planet {
    EARTH(6371), MARS(3390);
    private final int radius;
    Planet(int r) { this.radius = r; }
    public int getRadius() { return radius; }
}

基本写法:带抽象方法

public enum <名称> {
  <常量> { @Override public <返回> <方法>() { } };
  public abstract <返回> <方法>();
}
// 每个常量实现自己的行为
public enum Op {
    PLUS { public int apply(int a, int b) { return a + b; } },
    MINUS { public int apply(int a, int b) { return a - b; } };
    public abstract int apply(int a, int b);
}

枚举方法

基本写法:获取所有常量 <枚举>.values();

// 返回所有枚举常量数组
Color[] all = Color.values();

基本写法:按名获取 <枚举>.valueOf(<名称>);

// 按字符串名获取常量
Color c = Color.valueOf("RED");

基本写法:序号 <常量>.ordinal();

// 返回常量声明序号(从 0 开始)
int idx = Color.RED.ordinal();

基本写法:比较 <常量>.compareTo(<其他>);

// 按 ordinal 比较
int r = Color.RED.compareTo(Color.BLUE);

基本写法:名称 <常量>.name();

// 返回常量名字符串
String n = Color.RED.name();

EnumSet 枚举集合

基本写法:所有常量集合 EnumSet.allOf(<枚举类>.class);

// 创建包含全部常量的集合
EnumSet<Color> all = EnumSet.allOf(Color.class);

基本写法:指定常量集合 EnumSet.of(<常量>...);

// 创建包含部分常量的集合
EnumSet<Color> warm = EnumSet.of(Color.RED);

基本写法:补集 EnumSet.complementOf(<EnumSet>);

// 返回传入集合的补集
EnumSet<Color> rest = EnumSet.complementOf(warm);

基本写法:范围 EnumSet.range(<起>, <止>);

// 创建常量区间集合
EnumSet<Color> r = EnumSet.range(Color.RED, Color.BLUE);

EnumMap 枚举映射

基本写法:创建 EnumMap new EnumMap<<枚举>, <值>>(<枚举类>.class);

// 键为枚举的高效 Map
EnumMap<Color, String> names = new EnumMap<>(Color.class);
names.put(Color.RED, "红色");

枚举实现接口

基本写法:枚举实现接口

public interface <接口> { <方法签名>; }
public enum <名称> implements <接口> { ... }
// 枚举实现接口统一行为
public interface Operation { int apply(int a, int b); }
public enum BasicOp implements Operation {
    PLUS { public int apply(int a, int b) { return a + b; } }
}

枚举单例

基本写法:枚举单例模式

public enum <名称> {
  INSTANCE;
  public void <方法>() { }
}
// 线程安全的单例实现
public enum AppConfig {
    INSTANCE;
    private final Map<String, String> cfg = new HashMap<>();
    public String get(String k) { return cfg.get(k); }
}
// 使用:AppConfig.INSTANCE.get("key")