Java 枚举 enum 详解

本文深入解析Java枚举的定义、使用及高级特性。从基本语法到枚举成员的声明,再到自定义方法与内置功能,全面阐述枚举如何增强代码的可读性和安全性。

枚举是一个被命名的整型常数的集合,用于声明一组带标识符的常数;枚举在曰常生活中很常见,例如一个人的性别只能是“男”或者“女”,一周的星期只能是 1~7 天中的一个…类似这种当一个变量有几种固定可能的取值时,就可以将它定义为枚举类型;

在 JDK 1.5 之前没有枚举类型,那时候一般用接口常量来替代,而使用 Java 枚举类型 enum 可以更贴近地表示这种常量。


声明枚举

声明枚举时必须使用 enum 关键字,然后定义枚举的名称、可访问性、基础类型和成员等。枚举声明的语法如下:

enum-modifiers enum enumname:enum-base {
    enum-body,
}

其中,enum-modifiers 表示枚举的修饰符主要包括 public、private 和 internal;enumname 表示声明的枚举名称;enum-base 表示基础类型;enum-body 表示枚举的成员,它是枚举类型的命名常数;

任意两个枚举成员不能具有相同的名称,且它的常数值必须在该枚举的基础类型的范围之内,多个枚举成员之间使用逗号分隔;

如果没有显式地声明基础类型的枚举,那么意味着它所对应的基础类型是 int。

下面代码定义了一个表示性别的枚举类型 SexEnum 和一个表示颜色的枚举类型 Color。

public enum Gender {
    Male, Female;
}

public enum Color {
    Red, Blue, Black, Green, Yellow;
}

之后便可以通过枚举类型名直接引用常量,如 Gender.Male、Color.Red。

使用枚举还可以使 switch 语句的可读性更强,例如以下示例代码:

Gender gender = Gender.Male;
switch (gender) {
    case Male:
        // your code
        break;
    case Female:
        // your code
        break;
    default:
        // your code
}

枚举类

Java 中的每一个枚举都继承自 java.lang.Enum 类,当定义一个枚举类型时,每一个枚举类型成员都可以看作是 Enum 类的实例,这些枚举成员默认都被 final、public, static 修饰,当使用枚举类型成员时,直接使用枚举名称调用成员即可。

所有枚举实例都可以调用 Enum 类的方法,常用方法如下所示:

方法名称描述
values()以数组形式返回枚举类型的所有成员
valueOf()将普通字符串转换为枚举实例
compareTo()比较两个枚举成员在定义时的顺序
ordinal()获取枚举成员的索引位置
for (int i = 0; i < Color.values().length; i++) {
    System.out.println(Color.values()[i]);
}


System.out.println(Color.Red.compareTo(Color.valueOf("Black")));


System.out.println(Color.Green.ordinal());

为枚举添加方法

Java 为枚举类型提供了一些内置的方法,同时枚举常量也可以有自己的方法,此时要注意必须在枚举实例的最后一个成员后添加分号 ; ,而且必须先定义枚举实例。

下面的代码创建了一个枚举类型 ApiResult,而且在该类型中添加了自定义的方法:

public enum ApiResult {

    // 枚举实例
    SUCCESS(200, "success"),
    NOT_FOUND(404, "not found");

    // 成员变量
    private Integer code;
    private String message;

    // 构造方法
    private ApiResult(Integer code, String message) {
        this.code = code;
        this.message = message;
    }

    public Integer getCode() {
        return code;
    }

    public String getMessage() {
        return message;
    }

    // 重写父类方法
    @Override
    public String toString() {
        return String.format("code=%d, message=%s", code, message);
    }

    public static void main(String[] args) {
        System.out.println(ApiResult.SUCCESS.toString());
    }
}

作者 Github : tojohnonly , 博客 : EnskDeCode

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值