Java | 枚举和注解
更新: 1/30/2025 字数: 0 字 时长: 0 分钟
枚举
枚举是一组常量的集合,可以将其理解为一种特殊的类,其中仅包含一组有限且特定的对象。
实现方式
自定义类实现枚举
- 构造器私有化:防止外部
new
实例化,确保枚举对象的唯一性。 - 不提供
set
方法:枚举对象通常是只读的,不需要修改属性值。 - 遵循命名规范:枚举对象名称一般使用全大写字母,以符合常量命名习惯。
- 内部创建对象:在类的内部创建一组特定的对象,并使用
public static final
修饰,使其可被外部访问。
点击查看案例演示
javapublic class EnumExample { public static void main(String[] args) { System.out.println(Season.AUTUMN); System.out.println(Season.SPRING); } }
java// 自定义枚举类 final class Season { private final String name; private final String desc; // 预定义的枚举对象 public static final Season SPRING = new Season("春天", "温暖"); public static final Season WINTER = new Season("冬天", "寒冷"); public static final Season AUTUMN = new Season("秋天", "凉爽"); public static final Season SUMMER = new Season("夏天", "炎热"); // 私有构造方法,确保不能外部创建对象 private Season(String name, String desc) { this.name = name; this.desc = desc; } public String getName() { return name; } public String getDesc() { return desc; } @Override public String toString() { return name + "(" + desc + ")"; } }
text秋天(凉爽) 春天(温暖) 进程已结束,退出代码为 0
- 构造器私有化:防止外部
enum 关键字实现枚举
- 自动继承
Enum
类:enum
定义的枚举类默认继承Enum
,并且是final
类,无法被继承。 - 简化定义:
enum
直接定义枚举对象,无需手动创建public static final
变量,提高可读性和安全性。 - 构造方法默认私有:
enum
类型的构造方法默认是private
,无法在外部实例化,确保枚举对象的唯一性。 - 枚举对象的格式要求:枚举对象必须定义在最前面,多个对象间用
,
分隔,若后续有其他代码,需以;
结束。 - 无参构造可省略括号:若枚举对象使用无参构造方法,可省略
()
。 - 支持实现接口:枚举类可以像普通类一样实现接口。
点击查看案例演示
javapublic class EnumExample { public static void main(String[] args) { System.out.println(Season.AUTUMN); System.out.println(Season.SPRING); } }
java// 使用 enum 关键字定义枚举 enum Season { SPRING("春天", "温暖"), WINTER("冬天", "寒冷"), AUTUMN("秋天", "凉爽"), SUMMER("夏天", "炎热"); private final String name; private final String desc; // 构造方法(私有) Season(String name, String desc) { this.name = name; this.desc = desc; } public String getName() { return name; } public String getDesc() { return desc; } @Override public String toString() { return name + "(" + desc + ")"; } }
text秋天(凉爽) 春天(温暖) 进程已结束,退出代码为 0
- 自动继承
enum 的比较
- 使用
enum
定义的枚举类是一种引用类型。 - 引用类型比较,要使用
equals()
方法,如果使用==
比较,它比较的是两个引用类型的变量是否是同一个对象。 - 但
enum
类型可以例外。因为enum
类型的每个常量在 JVM 中只有一个唯一实例,所以可以直接用==
比较。
enum 常用方法
使用关键字
enum
时,会隐式继承Enum
类,这样我们就可以使用Enum
类相关的方法。
方法 | 描述 |
---|---|
name() | 获取当前枚举常量的名称,通常建议优先使用 toString() |
ordinal() | 获取当前枚举常量的次序(即声明的顺序) |
values() | 获取当前枚举类中所有的常量 |
valueOf() | 传递枚举类型的 Class 对象和枚举常量名称给静态方法 valueOf ,会返回与参数匹配的枚举常量 |
toString() | 返回当前枚举常量的名称。可以通过重写此方法来使得到的结果更易读 |
equals() | 在枚举类型中,通常使用 == 来比较两个枚举常量是否相等。Enum 提供的 equals() 方法也使用 == 实现。它在 Set 、List 和 Map 中使用时更加方便。注意,equals() 是不可变的 |
hashCode() | Enum 实现了 hashCode() ,以保证和 equals() 方法的一致性。它也是不可变的 |
getDeclaringClass() | 获取枚举常量所属枚举类型的 Class 对象,可用于判断两个枚举常量是否属于同一个枚举类型 |
compareTo() | 枚举类型实现了 Comparable 接口,允许比较两个枚举常量的大小(根据声明顺序) |
clone() | 枚举类型不能被克隆。为了防止子类实现 clone 方法,Enum 实现了一个抛出 CloneNotSupportedException 异常的不变 clone 方法 |
注解
注解(Annotation)也被称为元数据(Metadata),用于修饰解释包、类、方法、属性、构造器、局部变量等数据信息。
和注释一样,注解不影响程序逻辑,但注解可以被编译或运行,相当于嵌入在代码中的补充信息。
在 JavaSE 中,注解的使用目的比较简单,例如标记过时的功能,忽略警告等。
在 JavaEE 中,注解占据了更重要的角色,例如用来配置应用程序的任何切面,代替 JavaEE 旧版中所遗留的繁冗代码和 XML 配置等。
基本注解类型
@Override
- 作用:限定方法必须重写父类方法。
- 修饰范围:仅可修饰方法。
- 表示指定重写父类的方法(从编译层面验证),如果父类没有对应的方法,则会报错。
- 即使不写
@Override
,方法仍然可以重写,但使用该注解能避免拼写错误或参数不匹配等问题。
@Deprecated
- 作用:标记某个程序元素已过时,不建议使用。
- 修饰范围:可用于方法、类、字段、包、参数等。
- 作用可以做到新旧版本的兼容和过渡。
@SuppressWarnings
- 作用:抑制编译器警告。
- 修饰范围:类、方法、变量等。
元注解
元注解是用于修饰其他注解的注解,用来定义注解的作用范围、生命周期等。
@Retention
:指定注解的生命周期。RetentionPolicy.SOURCE
:仅在源码中保留,编译后丢弃(不会写入.class
文件)。RetentionPolicy.CLASS
:默认值,编译时保留在.class
文件中,但运行时不会加载到 JVM。RetentionPolicy.RUNTIME
:运行时可用,不仅写入.class
文件,JVM 也会保留,可通过反射获取。
@Target
:指定注解适用范围。ElementType.METHOD
:只能用于方法。ElementType.FIELD
:只能用于字段(成员变量)。ElementType.TYPE
:只能用于类、接口、枚举等。ElementType.CONSTRUCTOR
:构造方法。ElementType.PARAMETER
:方法参数。
@Documented
:使注解出现在 JavaDoc 中。- 标记的注解会被包含在 Javadoc 文档中,方便生成 API 文档时可见。
@Inherited
:允许子类继承父类的注解。- 如果父类被
@Inherited
标记的注解修饰,则子类自动继承该注解。
- 如果父类被