枚举类 / 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 块、
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;
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战