枚举(一)基础知识

本文详细介绍了Java枚举(enum)的概念、语法及常用方法。通过具体示例解释了如何定义枚举类型并使用其内置方法,如compareTo、equals、getDeclaringClass等。此外,还对比了枚举与常规类的区别,强调了枚举在表示固定集合时的优势。

目录


定义

enum 的全称为 enumeration, 是 JDK 1.5 中引入的新特性,存放在 java.lang 包中。

关键词enum可以将一组具名的值的有限集合创建为一种新的类型,而这些具名的值可以作为常规的程序组件来使用 。

《Java编程思想第四版》

通俗理解,枚举指一个经过排序的、被打包成一个单一实体的项列表。一个枚举的实例可以使用枚举项列表中任意单一项的值 。枚举在各个语言当中都有着广泛的应用,通常用来表示诸如颜色、方式、类别、状态等等数目有限、形式离散、表达又极为明确的量


语法

创建枚举类型要使用 enum 关键字,隐含了所创建的类型都是java.lang.Enum 类的子类(java.lang.Enum 是一个抽象类)。枚举类型符合通用模式Class Enum<E extends Enum<E>>,而 E 表示枚举类型的名称。枚举类型的每一个值都将映射到 protected Enum(String name, int ordinal)构造函数中,在这里,每个值的名称都被转换成一个字符串,并且序数设置表示了此设置被创建的顺序。

package enums;

/**
 * 季节枚举类
 *
 * @author zhaiaxin
 * @time: 2017/8/9 16:22.
 */

public enum SeasonEnums {

    SPRING,SUMMER,AUTUMN,WINTER;

}

这段代码实际上调用了4次 Enum(String name, int ordinal)构造方法

new Enum<SeasonEnums>("SPRING",0);
new Enum<SeasonEnums>("SUMMER",1);
… …
new Enum<SeasonEnums>("WINTER",3);

常用方法

int compareTo(E o) Compares this enum with the specified object for order

boolean equals(Object other)Returns true if the specified object is equal to this enum constant.

Class<E> getDeclaringClass() Returns the Class object corresponding to this enum constant’s enum type.

String name()Returns the name of this enum constant, exactly as declared in its enum declaration.

int ordinal()Returns the ordinal of this enumeration constant (its position in its enum declaration, where the initial constant is assigned an ordinal of zero).

String toString()Returns the name of this enum constant, as contained in the declaration.

static <T extends Enum<T>> valueOf(Class<T> enumType, String name)Returns the enum constant of the specified enum type with the specified name.

方法测试:

import enums.SeasonEnums;

/**
 * 测试SeasonEnums枚举的一些常用方法
 *
 * @author zhaiaxin
 * @time: 2017/8/9 16:24.
 */

public class testSeasonEnums {

    public static void main(String[] args){

        //int compareTo(E o)
        int result1 = SeasonEnums.SUMMER.compareTo(SeasonEnums.SPRING);
        int result2 = SeasonEnums.SUMMER.compareTo(SeasonEnums.SUMMER);
        int result3 = SeasonEnums.SUMMER.compareTo(SeasonEnums.AUTUMN);

        System.out.println("----------测试int compareTo(E o)方法----------");
        System.out.println("\nSUMMER 与 SPRING 比较结果为" + result1 + "\nSUMMER 与 SUMMER 比较结果为" + result2 + "\nSUMMER 与 AUTUMN 比较结果为" + result3);

        //boolean equals(Object other)
        boolean a = SeasonEnums.SUMMER.equals(SeasonEnums.SPRING);
        boolean b = SeasonEnums.SUMMER.equals(SeasonEnums.SUMMER);

        System.out.println("\n----------测试boolean equals(Object other)方法----------");
        System.out.println("\nSUMMER 与 SPRING 是否相等的结果为" + a + "\nSUMMER 与SUMMER 是否相等的结果为" + b);

        //Class<E> getDeclaringClass()
        Class class1 = SeasonEnums.SUMMER.getDeclaringClass();

        System.out.println("\n----------测试Class<E> getDeclaringClass()方法----------");
        System.out.println("\nclass1 的类型是" + class1);

        //String name()
        String name = SeasonEnums.AUTUMN.name();

        System.out.println("\n----------测试String name()方法----------");
        System.out.println("\nAUTUMN 的name()是" + name);

        //int ordinal()
        int ordinal = SeasonEnums.SPRING.ordinal();

        System.out.println("\n----------测试int ordinal()方法----------");
        System.out.println("\nSPRING 的次序是" + ordinal);

        //String toString()
        String string = SeasonEnums.AUTUMN.toString();

        System.out.println("\n----------测试String toString()方法----------");
        System.out.println("\nAUTUMN 的toString()是" + string);

        //static <T extends Enum<T>>  valueOf(Class<T> enumType, String name)

        System.out.println("\n----------测试static <T extends Enum<T>>  valueOf(Class<T> enumType, String name)方法----------");
        System.out.println("\nAUTUMN 的valueOf是" + SeasonEnums.valueOf("AUTUMN"));

    }
}

运算结果:

----------测试int compareTo(E o)方法----------

SUMMER 与 SPRING 比较结果为1
SUMMER 与 SUMMER 比较结果为0
SUMMER 与 AUTUMN 比较结果为-1

----------测试boolean equals(Object other)方法----------

SUMMER 与 SPRING 是否相等的结果为false
SUMMER 与SUMMER 是否相等的结果为true

----------测试Class<E> getDeclaringClass()方法----------

class1 的类型是class enums.SeasonEnums

----------测试String name()方法----------

AUTUMNname()是AUTUMN

----------测试int ordinal()方法----------

SPRING 的次序是0

----------测试String toString()方法----------

AUTUMNtoString()是AUTUMN

----------测试static <T extends Enum<T>>  valueOf(Class<T> enumType, String name)方法----------

AUTUMNvalueOfAUTUMN

总结

可以把 enum 看成是一个普通的 class,它们都可以定义一些属性和方法,不同之处是:
enum 不能使用 extends 关键字继承其他类,因为 enum 已经继承了 java.lang.Enum(java是单一继承)。
并且,如果在Java中需要表示诸如颜色、方式、类别、状态等等数目有限、形式离散、表达又极为明确的量,应当尽量舍弃常量表示的做法,而将枚举作为首要的选择

参考博客

http://blog.youkuaiyun.com/u014527058/article/details/52751488
http://www.cnblogs.com/hyl8218/p/5088287.html

<think>嗯,用户之前问过关于Java中的个类LevelParam的代码解析,现在他们又问到了Java基础知识中的枚举。我需要确定用户的需求是什么。可能他们正在学习Java,先接触了些类和静态数组的使用,现在想进步了解枚举的相关知识。 首先,用户可能需要枚举的基础概念,比如什么是枚举类型,为什么使用它。然后,可能需要知道枚举的基本语法,如何定义,以及枚举的常用方法。此外,用户可能对枚举的应用场景感兴趣,比如单例模式、状态机等。 考虑到用户之前的问题涉及到静态数组,可能他们在实际项目中遇到了需要定义组常量或者有限集合的情况,这时候枚举就比静态数组更合适。比如LevelParam中的levels数组,如果使用枚举可能会更安全和易维护。 用户可能没有直接说出来的深层需求是,如何优化他们之前的代码,或者了解更好的实践方式。比如用枚举代替静态常量数组,可以避免null值的问题,并且提供类型安全。 接下来,我需要组织回答的结构。先从枚举的定义开始,然后语法,再讲特性,比如构造方法、实现接口等。接着是应用场景和优点,最后结合之前的例子对比静态数组,展示枚举的优势。同时,需要注意用户提到的代码规范,比如使用中文回答,结构清晰,数学公式的格式等。 需要确保解释清晰,步骤分明,给出代码示例,并且指出注意事项。比如在之前的LevelParam中使用枚举的话,如何改写,这样用户能直观看到两者的区别和优势。还要提到枚举在switch中的使用,以及values()方法,这些都是常见且实用的知识点。 另外,用户可能对枚举的内存管理或底层实现感兴趣,但作为基础知识,可能不需要深入太多,保持简洁明了即可。需要避免使用过于专业的术语,用易懂的中文解释概念,并给出实际例子帮助理解。 最后,总结枚举的优点,强调类型安全、可读性高、防止非法值等,这些都是用户在实际开发中需要的优势。可能用户之前用静态数组遇到了维护或安全问题,通过枚举的介绍,帮助他们找到更好的解决方案。</think>以下是对Java枚举(enum)基础知识的系统化讲解: $$枚举核心定义公式$$ $$ \text{enum} \ \text{枚举名} \ \{ \text{常量列表} \} \ \text{//本质是继承java.lang.Enum的类} $$ --- ### 枚举基础 **1. 定义格式** ```java // 权限修饰符 enum 枚举名 { 常量列表 } public enum Season { SPRING, // 等价于 public static final Season SPRING = new Season(); SUMMER, AUTUMN, WINTER } ``` **2. 本质特征** - 每个枚举常量都是该枚举类的实例 - 自动继承`java.lang.Enum`类(无法手动继承其他类) - 编译后生成`final class`(不可被继承) --- ### 二、枚举语法进阶 **1. 带参数的枚举** ```java public enum HttpStatus { OK(200, "成功"), NOT_FOUND(404, "资源未找到"); private final int code; private final String desc; // 枚举的构造器默认私有 HttpStatus(int code, String desc) { this.code = code; this.desc = desc; } // 可定义方法 public int getCode() { return code; } public String getDesc() { return desc; } } ``` **2. 实现接口** ```java interface Showable { void show(); } enum Color implements Showable { RED { public void show() { System.out.println("红色"); } }, GREEN { public void show() { System.out.println("绿色"); } }; } ``` --- ### 三、枚举核心方法 | 方法 | 描述 | 示例 | |------|-----|------| | `values()` | 返回所有枚举常量数组 | `Season[] seasons = Season.values();` | | `valueOf(String)` | 根据名称获取枚举常量 | `Season s = Season.valueOf("SPRING");` | | `name()` | 获取常量名称(final) | `"SPRING"` | | `ordinal()` | 获取常量声明顺序 | `SPRING.ordinal()` → 0 | --- ### 四、典型应用场景 1. **状态管理** ```java enum OrderStatus { UNPAID, PAID, DELIVERED, COMPLETED } ``` 2. **错误代码统管理** ```java enum ErrorCode { SUCCESS(0), PARAM_ERROR(40001), SYSTEM_ERROR(50001); //...构造器和方法 } ``` 3. **单例模式实现** ```java enum Singleton { INSTANCE; public void doSomething() { /*...*/ } } ``` --- ### 五、与普通类的对比 | 特性 | 枚举类 | 普通类 | |---------------------|---------------------------|--------------------------| | 继承关系 | 隐式继承Enum | 可自由继承 | | 实例化方式 | 预定义固定实例 | 可任意创建实例 | | 构造器访问权限 | 仅允许private | 可设置public/protected | | 线程安全性 | 天然线程安全 | 需额外同步控制 | | 序列化机制 | 自动处理 | 需实现Serializable接口 | --- ### 六、最佳实践建议 1. 优先使用枚举替代`public static final`常量 2. 需要扩展常量时,枚举比接口常量更易维护 3. 在switch语句中使用枚举可提高可读性 ```java switch(status) { case UNPAID: ... break; case PAID: ... break; } ``` 4. 需要动态创建实例时不宜使用枚举 --- **对比您之前提到的`LevelParam`类**: 如果用枚举重构关卡配置会更安全: ```java public enum Level { EASY(1, 30), MEDIUM(2, 20), HARD(3, 15); // 避免数组越界和null值问题 private final int levelNum; private final int timeLimit; private Level(int num, int time) { this.levelNum = num; this.timeLimit = time; } // getters... } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值