枚举类 / enum 关键字

1、枚举是一组常量集合,属于一种特殊类,只包含一组有限的特殊对象

2、自定义类实现枚举

(1)构造器 private 化,防止直接创建

(2)不需要 set 方法,防止属性被修改

(3)定义 public static final 常量对象

(4)大写字母组成常量名,下划线连接多单词

(5)定义 private 常量的属性

(6)提供 get 方法,获取常量的属性

class Enumeration {

    private String field;

    private Enumeration() {
    }

    private Enumeration(String field) {
        this.field = field;
    }

    public static final Enumeration CONSTANT1 = new Enumeration("字段1");
    public static final Enumeration CONSTANT2 = new Enumeration("字段2");
    public static final Enumeration CONSTANT3 = new Enumeration();
    public static final Enumeration CONSTANT4 = new Enumeration();

    public String getField() {
        return field;
    }
}

 

enum 关键字

1、实现枚举事项

(1)enum 代替 class

(2)定义常量对象必须放在枚举类行首

常量名1(实参列表),常量名2(实参列表);

(3)构造器 private 化,避免直接创建,enum 类中的构造器默认为 private,可以显式指定 private,但不允许为 public、protected 

(4)不需要 set 方法,防止属性被修改

(5)private 化常量的属性

(6)提供 get 方法,获取常量的属性

public enum Enumeration {

    CONSTANT1, CONSTANT2,
    CONSTANT3("字段1"), CONSTANT4("字段2");

    private String field;

    Enumeration() {
    }

    Enumeration(String field) {
        this.field = field;
    }

    public String getField() {
        return field;
    }
}

2、事项

(1)调用常量

类名 对象名 = 类名.常量名;

(2)switch 可以直接使用 enum 枚举类中的常量,枚举值不能带枚举类型前缀

(3)enum 枚举类在编译后,隐式默认继承 Enum 抽象类,而不是继承 Object 类,所以  enum 枚举类不能继承其他类

(4)声明 enum 后,该类会被编译器加上 final 声明,所以 enum 枚举类无法被继承

(5)enum 枚举类可以实现接口,Enum 抽象类实现 Serializable、Comparable 接口

(6)编译器自动添加 static 块、VALUESstaticVALUES、枚举值;如果枚举类有显式自定义 static 代码块,则在自动添加的 static 代码块中最后执行,同时说明了第一次调用枚举值时的调用顺序:普通代码块 -> 构造器 -> static 代码块

public static final 枚举类型 枚举值1;
……
private static final 枚举类型 $VALUES[];

static
{
    枚举值1 = new 枚举类型("枚举值1", 0, 自定义字段1,……);
    枚举值2 = new 枚举类型("枚举值2", 1, 自定义字段1,……);
    ……
    $VALUES = (new 枚举类型[] {
        枚举值1, 枚举值2,……
    });
    
    //显式自定义 static 代码块
}

(7)不论枚举类调用无参构造器或有参构造器,编译器都会添加 String s, int i 形式参数,并设为 private,因为要调用父类 Enum 的构造器

private 枚举类型(String s, int i, 自定义字段类型1 形参1,……)
{
    super(s, i);
    //显式自定义普通代码块
    //显式自定义构造器
    this.自定义字段类型1 = 形参1;//此代码可能来自普通代码块,也可能来自构造器
    ……
}
//name:此枚举常量的名称,它是用于声明它的标识符。
//ordinal:这个枚举常数的序数(它在枚举声明中的位置,其中初始常数被分配为零的序数)
protected Enum(String name, int ordinal)

(8)多个枚举对象,使用逗号间隔,以分号结尾

(9)常量必须声明在枚举类行首

(10)构造器只在构造枚举常量时调用

(11)枚举变量使用 equals 和 == 比较,结果一致

(12)枚举类型作为某个类中的成员字段时,隐式地用 static final 修饰

3、常用方法

(1)values():以数组形式返回当前枚举类中的所有常量,是由编译器添加的方法,若将枚举类向上转型为 Enum,则该方法不可用

枚举类名[] 数组名 = 枚举类名.values();
private static final 枚举类名 $VALUES[];

public static 枚举类名[] values() {
    return (枚举类名[])$VALUES.clone();
}

(2)以 String 类型返回当前常量对象名,Enum 类重写 toString 方法,子类可重写 toString 方法,用于返回对象属性

public String toString() {
    return name;
}

(3)以 String 类型返回当前常量对象名,子类不可重写该方法

public final String name() {
    return name;
}

(4)以 int 类型返回当前常量对象序数,序数是常量在枚举类中声明的位置,其中初始常量的序数为 0

public final int ordinal() {
    return ordinal;
}

(5)返回具有指定名称的指定枚举类型的枚举常量,该名称必须与用于声明此类型的枚举常量的标识符完全一致,不允许使用外来空白字符

类名 对象名 = 类名.valueOf("常量名")
public static <T extends Enum<T>> T valueOf(Class<T> enumType, String name) {
    T result = enumType.enumConstantDirectory().get(name);
    if (result != null)
        return result;
    if (name == null)
        throw new NullPointerException("Name is null");
    throw new IllegalArgumentException(
        "No enum constant " + enumType.getCanonicalName() + "." + name);
}

(6)将此枚举与指定常量进行序数比较,用此枚举常量序数减去指定常量序数,返回一个负整数,零或正整数,代表该对象小于,等于或大于指定对象,此枚举需要与指定常量的枚举类型相同

public final int compareTo(E o) {
    Enum<?> other = (Enum<?>)o;
    Enum<E> self = this;
    if (self.getClass() != other.getClass() && // optimization
        self.getDeclaringClass() != other.getDeclaringClass())
        throw new ClassCastException();
    return self.ordinal - other.ordinal;
}
posted @   半条咸鱼  阅读(155)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
点击右上角即可分享
微信分享提示