Java枚举类

源码

public enum CauseEnum {
    CAUSE01("CAUSE-01", "商家订单量少"),
    CAUSE02("CAUSE-02", "商家联系方式错误"),
    CAUSE03("CAUSE-03", "商家不是本网点客户"),
    CAUSE04("CAUSE-04", "黑名单商家"),
    CAUSE05("CAUSE-05", "商家自己要求取消审核,放弃使用"),
    CAUSE06("CAUSE-06", "商家重复提交"),
    CAUSE07("CAUSE-07", "商家地址错误"),
    CAUSE08("CAUSE-08", "该网点不支持电子面单"),
    CAUSE09("CAUSE-09", "网点和商家没有达成业务合作");

    private String code;  //code
    private String desc;  //中文描述

    CauseEnum(String code, String desc) {
        this.code = code;
        this.desc = desc;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public String getDesc() {
        return desc;
    }

    public void setDesc(String desc) {
        this.desc = desc;
    }

    public static String getNameByCode(String code) {
        if (null == code || "".equals(code) || "null".equals(code)) {
            return null;
        }
        for (CauseEnum causeEnum : CauseEnum.values()) {
            if (code.equals(causeEnum.getCode())) {
                return causeEnum.getDesc();
            }
        }
        return null;
    }

    public static String getNameByDesc(String desc) {
        if (null == desc || "".equals(desc) || "null".equals(desc)) {
            return null;
        }
        for (CauseEnum causeEnum : CauseEnum.values()) {
            if (desc.equals(causeEnum.getDesc())) {
                return causeEnum.getCode();
            }
        }
        return null;
    }
}

代码测试

 public static void main(String[] args) {
     System.out.println(getNameByDesc("商家联系方式错误"));
     System.out.println(getNameByCode("CAUSE-06"));
     System.out.println("-----------------------");
     // java.lang.Enum的valueOf方法,返回枚举类对象
     CauseEnum en= CauseEnum.valueOf("CAUSE04");
     System.out.println(en.code);
     System.out.println(en.desc);
 }
  • 运行结果
CAUSE-02
商家重复提交
-----------------------
CAUSE-04
黑名单商家

规范

  • 枚举类名建议带上Enum后缀,枚举成员名称需要全大写,单词间用下划线隔开。 说明:枚举其实就是特殊的类,域成员均为常量,且构造方法被默认强制是私有。 正例:枚举名字为ProcessStatusEnum的成员名称:SUCCESS / UNKNOWN_REASON。

  • 举例说明

package com.sankuai.inf.leaf.common;

public enum  Status {
    SUCCESS,
    EXCEPTION
}

<think> 首先,用户询问的是Java枚举类的使用和特性。我需要基于提供的引用和信息来回答。引用的内容包括枚举类的定义、特性、使用方法、优缺点以及与自定义枚举类的对比。 关键点从引用中提取: - 引用[1]: Java枚举类可以用来定义固定的常量集合,支持方法、构造方法、抽象方法等。需要警惕修改时的问题,如编译错误、运行时错误、序列化问题。 - 引用[2]: Java 5开始提供枚举类,它继承java.lang.Enum类,是引用数据类型。以前可以用静态常量替代,但枚举更清晰易维护。 - 引用[3]: 枚举类有内置方法如values(), valueOf(),方便遍历和获取枚举值。 - 引用[4]: 对比自定义枚举类enum关键字。enum关键字自动继承java.lang.Enum,提供values(), valueOf()方法,语法更简洁。 - 引用[5]: 示例代码展示如何使用枚举,包括遍历、switch语句等。 用户的需求是获取Java枚举类的使用方法和特性。所以,我的回答应该包括: - 什么是Java枚举类? - 它的特性(如继承自Enum、支持方法等)。 - 如何使用(声明、遍历、switch语句等)。 - 优点(代码清晰、类型安全)。 - 需要注意的问题(如序列化问题)。 回答结构要清晰: 1. **引言**: 简要介绍Java枚举类。 2. **特性**: 列出主要特性。 3. **使用方法**: 分步骤或示例说明。 4. **注意事项**: 提到潜在问题。 5. **与静态常量的对比**: 突出优势。 6. **相关问题**: 按照系统指令,生成相关问题。 系统指令要求: - 使用中文回答。 - 行内数学表达式用$...$(但这里可能不适用,因为主题是编程,不是数学)。 - 独立公式用$$...$$(同样,可能不需要)。 - 引用末尾添加引用标识。 - 生成相关问题。 在回答中,自然地添加引用标识:[^1], [^2], 等,基于用户提供的引用。 相关问题生成:基于主题,询问枚举类的深入方面,如性能、最佳实践、常见错误等。 大纲回答: 1. **Java枚举类介绍**: 简述枚举类的概念和历史背景。 - 源自引用[2]: Java 5引入,替代静态常量。 2. **主要特性**: - 继承自java.lang.Enum。 - 支持方法、构造方法、抽象方法。 - 内置方法如values(), valueOf()。 - 类型安全。 3. **使用方法**: - 声明枚举。 - 遍历枚举值(使用values())。 - 获取特定枚举(使用valueOf())。 - 在switch语句中使用。 - 添加自定义方法或字段。 4. **优点**: - 代码清晰、易维护。 - 避免错误(如错误的值)。 5. **注意事项**: - 修改枚举可能导致的序列化问题[^1]。 - 不能继承其他类[^4]。 6. **示例**: 提供一个简单的代码示例。 7. **相关问题**: 生成3-5个相关问题。 确保回答真实可靠,基于引用。 最终输出: - 回答部分。 - 相关问题部分。 </think> ### Java枚举类的使用和特性 Java枚举类Enum)是Java 5引入的一种特殊类类型,用于定义一组固定的常量集合。它继承自`java.lang.Enum`,是引用数据类型,这使得代码更加类型安全、清晰和易于维护。枚举类不仅支持常量的定义,还允许添加方法、构造方法和抽象方法,极大地提升了灵活性和功能扩展性。以下是Java枚举类的详细使用方法和特性总结,基于提供的引用内容。 #### 1. **Java枚举类的主要特性** Java枚举类的核心特性源自其设计,主要包括以下几点: - **继承自java.lang.Enum类**: 枚举类隐式继承`java.lang.Enum`,因此无法再继承其他类(如自定义父类)。这提供了内置方法如`ordinal()`(返回枚举常量的索引位置)和`name()`(返回枚举常量的名称)[^2], [^4]。 - **支持自定义方法**: 枚举类可以定义实例方法、构造方法和抽象方法。例如,可以为每个枚举常量添加特定行为,从而实现面向对象的设计[^1], [^5]。 - **类型安全**: 枚举常量是编译时确定的,避免了传统静态常量(如`final static`变量)可能导致的类型错误或无效值问题。例如,使用枚举可以确保常量值是预定义的集合[^2], [^4]。 - **内置便捷方法**: 枚举自动生成`values()`方法(返回所有枚举常量的数组)和`valueOf()`方法(根据名称获取枚举常量)。这简化了遍历和查找操作[^3], [^4]。 - **语法简洁**: 枚举声明使用`enum`关键字,语法比传统自定义枚举类更简洁。例如,一行代码即可定义枚举常量,无需显式声明对象和修饰符[^4]。 - **缺点与注意事项**: - 修改枚举(如添加新常量)可能导致编译错误或运行时问题,尤其是在序列化和反序列化时,因为枚举的序列化机制依赖于常量名称[^1]。 - 由于继承限制,枚举无法扩展其他类,但可自由实现接口[^4]。 #### 2. **Java枚举类的使用方法** 枚举类的使用包括声明、遍历、取值和高级定制。以下通过示例逐步说明: - **基本声明和定义**: 使用`enum`关键字定义枚举类,每个常量逗号分隔。常量名称通常大写。 ```java enum Color { // 定义颜色枚举 RED, GREEN, BLUE // 枚举常量 } ``` - **遍历枚举常量**: 使用`values()`方法获取所有常量数组,并可结合循环遍历。 ```java public class Main { public static void main(String[] args) { for (Color c : Color.values()) { // 遍历所有枚举值 System.out.println(c + " ordinal: " + c.ordinal()); // 输出名称和索引值 } } } ``` 输出示例: ``` RED ordinal: 0 GREEN ordinal: 1 BLUE ordinal: 2 ``` 此方法来源于枚举的内置特性,方便调试和日志记录[^3], [^5]。 - **获取特定枚举常量**: 使用`valueOf()`方法根据名称获取枚举值。 ```java Color c = Color.valueOf("RED"); // 根据名称获取枚举 System.out.println("Value of RED: " + c); // 输出: Value of RED: RED ``` 如果名称无效,会抛出`IllegalArgumentException`,提高了鲁棒性[^3], [^5]。 - **在switch语句中使用**: 枚举常量天然适用于switch-case结构,减少错误。 ```java enum Status { SUCCESS, FAILURE } // 定义状态枚举 public class Test { public static void main(String[] args) { Status status = Status.SUCCESS; switch (status) { case SUCCESS: System.out.println("成功"); // 输出: 成功 break; case FAILURE: System.out.println("失败"); break; } } } ``` switch确保只处理有效常量,避免无效分支[^5]。 - **添加自定义方法和字段**: 枚举类支持定义构造方法、实例变量和方法,实现高级功能。 ```java enum Planet { EARTH(1.0), MARS(0.38); // 枚举常量带参数 private double gravity; // 实例变量 Planet(double gravity) { // 构造方法私有化 this.gravity = gravity; } public double getGravity() { // 自定义方法 return gravity; } } public class Main { public static void main(String[] args) { System.out.println("Earth gravity: " + Planet.EARTH.getGravity()); // 输出: Earth gravity: 1.0 } } ``` 这展示了枚举的面向对象能力,使代码更模块化[^1], [^4]。 #### 3. **优势与最佳实践** - **优势**: - **代码清晰性**: 枚举比静态常量(如`public static final int RED = 1;`)更易读和维护,尤其在表示一组相关常量(如星期、状态)时[^2], [^4]。 - **类型安全**: 编译器检查确保只使用预定义值,减少运行时异常。 - **功能扩展**: 支持抽象方法(每个常量可覆盖),实现多态行为[^1]。 - **最佳实践**: - **避免频繁修改**: 添加或删除枚举常量可能破坏序列化,建议在设计中预留扩展性[^1]。 - **优先使用内置方法**: 如`values()`和`valueOf()`,替代手动实现。 - **结合接口**: 如果需要多继承,让枚举实现接口[^4]。 #### 4. **注意事项** - **序列化风险**: 枚举通过名称序列化,修改常量名称会导致反序列化错误。确保枚举稳定后再部署[^1]。 - **性能考虑**: 枚举常量的创建在类加载时完成,开销小,但大型枚举可能占用内存。 - **兼容性问题**: 在旧版JavaJava 5前)无法使用,需回退到静态常量方案[^2]。 Java枚举类是强大的工具,适用于定义状态码、配置选项或有限集合的场景。通过合理使用,可以大幅提升代码质量[^1], [^2], [^3], [^4], [^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值