Skip to content

Java | 枚举和注解

更新: 1/30/2025 字数: 0 字 时长: 0 分钟

枚举

枚举是一组常量的集合,可以将其理解为一种特殊的类,其中仅包含一组有限且特定的对象。

实现方式

  • 自定义类实现枚举

    • 构造器私有化:防止外部 new 实例化,确保枚举对象的唯一性。
    • 不提供 set 方法:枚举对象通常是只读的,不需要修改属性值。
    • 遵循命名规范:枚举对象名称一般使用全大写字母,以符合常量命名习惯。
    • 内部创建对象:在类的内部创建一组特定的对象,并使用 public static final 修饰,使其可被外部访问。
    点击查看案例演示
    java
    public 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,无法在外部实例化,确保枚举对象的唯一性。
    • 枚举对象的格式要求:枚举对象必须定义在最前面,多个对象间用 , 分隔,若后续有其他代码,需以 ; 结束。
    • 无参构造可省略括号:若枚举对象使用无参构造方法,可省略 ()
    • 支持实现接口:枚举类可以像普通类一样实现接口。
    点击查看案例演示
    java
    public 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() 方法也使用 == 实现。它在 SetListMap 中使用时更加方便。注意,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 标记的注解修饰,则子类自动继承该注解。

贡献者

The avatar of contributor named as wkwbk wkwbk

页面历史