Java枚举类

文章介绍了Java中枚举类的概念,包括枚举类的自定义方式,使用enum关键字的简洁实现,以及枚举类的属性、构造方法和常用方法如values()和valueOf()。此外,还展示了枚举类如何实现接口,提供了示例代码进行解释。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概念

枚举类,顾名思义即类的对象只有确定的有限个。比如:

  • 星期:周一、 ...  、周日

  • 性别:男、女

  • 季节:春、夏、秋、冬

  • 线程状态:NEW、RUNNABLE、BLOCKED、WAITING、TIMEED_WAITING、TERMINATED

枚举类的实现

  •     jdk1.5之前需要自定义枚举类

  •     jdk1.5新增的enum关键字用于定义枚举类

枚举类的属性

  • 枚举类的属性应不允许被改动,所以应使用private final修饰

  • 枚举类的使用private final 修饰的属性应在构造方法中进行赋值

  • 若枚举类显式的定义了带参数的构造方法,则在列出枚举值时也必须传入对应的参数

自定义枚举类


/**
 * 自定义枚举类
 */
class DateType {
    //1、声明自定义枚举类对象的属性,要用private final修饰
    private final String date;
    private final String description;

    //2、私有化构造方法,并给属性赋值
    private DateType(String date, String description) {
        this.date = date;
        this.description = description;
    }

    //3、提供当前枚举类 用static final修饰(可通过类名直接调用且不可变)
    public static final DateType YESTERDAY = new DateType("昨天", "悟已往之不谏");
    public static final DateType TODAY = new DateType("今天", "珍惜当下");
    public static final DateType TOMORROW = new DateType("明天", "知来者之可追");

    //4、其他诉求:比如get()方法、toString()方法
    public String getDate() {
        return date;
    }

    public String getDescription() {
        return description;
    }

    @Override
    public String toString() {
        return "DateType{" +
                "date='" + date + '\'' +
                ", description='" + description + '\'' +
                '}';
    }
}

测试代码


public class EnumTest {
    public static void main(String[] args) {
        DateType yesterday = DateType.YESTERDAY;
        DateType today = DateType.TODAY;
        DateType tomorrow = DateType.TOMORROW;
        System.out.println(yesterday);
        System.out.println(today);
        System.out.println(tomorrow);
   }
}

控制台输出

DateType{date='昨天', description='悟已往之不谏'}DateType{date='今天', description='珍惜当下'}DateType{date='明天', description='知来者之可追'}

使用enum关键字定义枚举类

/**
 * 使用enum关键字定义枚举类
 */
enum DateType1 {
    //1、提供当前枚举类对象,多个对象之间用,隔开 末尾的对象以分号结束
    YESTERDAY("昨天", "悟已往之不谏"),
    TODAY("今天", "珍惜当下"),
    TOMORROW("明天", "知来者之可追");

    //2、声明自定义枚举类对象的属性,要用private final修饰
    private final String date;
    private final String description;

    //3、私有化构造方法,并给属性赋值
    private DateType1(String date, String description) {
        this.date = date;
        this.description = description;
    }

    //4、其他诉求:比如get()方法、toString()方法
    public String getDate() {
        return date;
    }

    public String getDescription() {
        return description;
    }

    @Override
    public String toString() {
        return "DateType1{" +
                "date='" + date + '\'' +
                ", description='" + description + '\'' +
                '}';
    }
}

        对比两种实现方式,都需要提供属性(如果有)和私有构造方法。使用enum关键字实现时,非常简洁。

Enum类的常用方法

  1. values()方法:返回枚举类的对象数组,该方法可以很方便地遍历所有的枚举值

  2. valueOf(String str):如果传入的字符串和枚举类的名称匹配,那么将该字符串转变为对应的枚举类对象。如果不匹配,则抛出 IllegalArgumentException 异常

  3. toString:返回当前枚举类对象常量的名称

测试代码


public class EnumTest {
    public static void main(String[] args) {
        //Enum类的values方法
        DateType1[] dateType1s = DateType1.values();
        for(DateType1 dateType1 : dateType1s) {
            System.out.println(dateType1);
        }
        //valueOf方法
        System.out.println("找到了枚举类:" + DateType1.valueOf("TODAY"));
        System.out.println("找到了枚举类:"  + DateType1.valueOf("TODAY1"));
    }
}

控制台输出

YESTERDAYTODAYTOMORROW找到了枚举类:TODAYException in thread "main" java.lang.IllegalArgumentException: No enum constant com.canon.enumeration.DateType1.TODAY1  at java.base/java.lang.Enum.valueOf(Enum.java:240)  at com.canon.enumeration.DateType1.valueOf(EnumTest.java:66)  at com.canon.enumeration.EnumTest.main(EnumTest.java:20)

使用enum关键字定义的枚举类实现接口的方式

  • 情况一:实现接口,在enum类中实现抽象方法(就和普通的类实现接口一样)

  • 情况二:让枚举类的对象分别实现接口中的抽象方法

interface Info {
    void show();
}
/**
 * 使用enum关键字定义枚举类
 */
enum DateType1 implements Info{
    //1、提供当前枚举类对象,多个对象之间用,隔开 末尾的对象以分号结束
    YESTERDAY("昨天", "悟已往之不谏") {
        @Override
        public void show() {
            System.out.println("认识到过去的错误已经不可挽回");
        }
    },
    TODAY("今天", "珍惜当下") {
        @Override
        public void show() {
            System.out.println("珍惜时间,珍惜眼前人");
        }
    },
    TOMORROW("明天", "知来者之可追") {
        @Override
        public void show() {
            System.out.println("知道未来的事还来得及补救");
        }
    };

    //2、声明自定义枚举类对象的属性,要用private final修饰
    private final String date;
    private final String description;

    //3、私有化构造方法,并给属性赋值
    private DateType1(String date, String description) {
        this.date = date;
        this.description = description;
    }
}

### 关于 Java 枚举类的定义与使用 #### 1. 枚举类的概念 枚举类是一种特殊的类,用于表示一组固定的常量集合。它在 Java 中是一个非常强大的工具,可以帮助开发者更清晰地表达某些特定类型的含义。 #### 2. 如何定义枚举类 枚举类通过 `enum` 关键字来定义。下面是一个简单的枚举类定义示例: ```java public enum Color { RED, GREEN, BLUE; } ``` 在这个例子中,`Color` 是一个枚举类,包含了三个固定值:`RED`, `GREEN`, 和 `BLUE`[^1]。 #### 3. 枚举类的基本用法 枚举类可以直接作为变量类型使用,并且可以通过其静态方法获取对应的实例或者所有的枚举项列表。例如: ```java // 获取单个枚举实例 Color color = Color.RED; // 遍历所有枚举值 for (Color c : Color.values()) { System.out.println(c); } ``` 这里调用了 `values()` 方法返回了一个数组,该数组包含了当前枚举类的所有可能取值[^2]。 #### 4. 枚举类中的构造函数和字段 除了基本形式外,还可以给枚举类添加私有的构造函数以及公共或私有的属性。比如: ```java public enum Planet { MERCURY(3.303e+23, 2.4397e6), VENUS(4.869e+24, 6.0518e6); private final double mass; // 质量单位为千克 private final double radius; // 半径单位为米 Planet(double mass, double radius) { this.mass = mass; this.radius = radius; } public double getMass() { return mass;} public double getRadius(){return radius;} } ``` 此代码片段展示了如何向枚举类增加额外的数据成员及其访问器方法[^3]。 #### 5. 枚举类支持抽象方法实现 如果需要让每个枚举实例都提供自己独特的行为,则可以让枚举类包含抽象方法并由各个具体实例去实现它们: ```java public enum Operation { PLUS { @Override public int apply(int a, int b) { return a + b; } }, MINUS { @Override public int apply(int a, int b) { return a - b; } }; abstract public int apply(int a, int b); } Operation op = Operation.PLUS; System.out.println(op.apply(10, 5)); // 输出结果应为15 ``` 这段程序说明了即使是在同一个枚举类别下不同个体之间也允许存在差异化的逻辑处理方式[^3]。 #### 6. 特殊方法的价值Of与Values 每一个枚举都会自动获得两个特别重要的方法:`valueOf(String name)` 和 `values()` 。前者依据字符串名称查找匹配的具体对象;后者则列举出全部可用选项形成数组供外部循环读取之用[^3]。 --- ### 总结 以上就是关于Java枚举类的基础概念、创建过程以及实际应用场景等内容概述。利用好这些特性和技巧可以使我们的应用程序更加健壮可靠同时也提高了可维护性水平!
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值