枚举 Enum

本文探讨了枚举在编程中的重要性,通过实例展示了如何使用枚举提升代码维护性、类型安全和可读性。介绍了单值枚举和多值枚举的区别,以及与传统常量的对比,并提到了EnumSet和EnumMap在枚举操作中的作用。

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

一、为什么需要枚举

举个例子,生物界性别分“雄性”、“雌性”和“中性”,将其定义为静态常量:

public class Gender{
    public static final int Male = 1;
    public static final int Female = 2;
    public static final int Neutral = 3;
}

对于这种单值类型的静态常量定义,本身也没错,主要是在使用的地方没有一个明确性的约束而已,比如这里的 judgeGender 方法的本意是传入 Gender 的三种静态常量之一,但由于没有类型上的约束,因此传入任意一个 int 值都是可以的,编译器也不会提出任何警告。

void judgeGender(int code){}

但是在枚举类型出现之后,上面这种情况就可以用枚举严谨地去约束,比如用枚举去定义性别就非常简洁了:

public enum Gender {
    Male, Female, Neutral
}

而且主要是在用枚举的地方会有更强的类型约束。如下入参类型就会受到明确的类型约束,一旦传入无效值,编译器就会帮检查,从而规避潜在问题。除此之外,枚举在扩展性方面比普通常量更方便、也更优雅。

//入参就限定了类型
void judgeGender(Gender gender){}

综上,枚举的意义:
1️⃣封装有限的变化,提高代码维护性,确保变量合法。
如果利用 int 类型表示星期一到星期日的话,就要判断输入 int 变量不在 1-7 的范围内的情况。
2️⃣代码更优雅,提高代码可读性。一个复制的程序里面,可能要用到成百上千的静态常量,如果全写在一个文件里面,容易造成命名混淆,程序读起来也比较麻烦。

二、单值枚举

定义一个性别枚举:

public enum Gender {
    Male, Female, Neutral
}

枚举的所有基本用法:

public class judgeGender {
    public static void main(String[] args) {
        for (Gender genderType : Gender.values()) {
            System.out.println(genderType);
        }
        Gender male = Gender.Male;
        Gender female = Gender.Female;
        Gender neutral = Gender.Neutral;
        System.out.println(male.ordinal());//0
        System.out.println(female.ordinal());//1
        System.out.println(neutral.ordinal());//2
        System.out.println(male.name());//Male
        System.out.println(female.name());//Female
        System.out.println(neutral.name());//Neutral
        System.out.println(male.compareTo(male));//0
        System.out.println(male.compareTo(female));//-1
        System.out.println(female.compareTo(neutral));//-1
        System.out.println(Gender.valueOf("Male"));//Male
        System.out.println(Gender.valueOf("Female"));//Female
        System.out.println(Gender.valueOf("Neutral"));//Neutral
        Gender gender = Gender.Male;
        switch (gender) {
            case Male:
                System.out.println("男");
                break;
            case Female:
                System.out.println("女");
                break;
            case Neutral:
                System.out.println("中性");
                break;
        }//男
    }
}

compareTo

三、多值枚举

上面展示的枚举例子非常简单,仅仅是单值的情形,而实际项目中用枚举往往是多值用法。扩充一下上面的 Gender 枚举,在里面加入 【说明 – 编码】的对应关系,这也是实际项目中常用的用法。可以在枚举里自定义各种属性、构造函数、甚至各种方法:

public enum GenterType {

    Male("男", "01"),
    Female("女", "02"),
    Neutral("中性", "03"),
    ;

    //自定义属性
    private final String explain;
    private final String code;
    public String getExplain() {
        return explain;
    }
    public String getCode() {
        return code;
    }
    //自定义构造函数
    GenterType(String explain, String code) {
        this.explain = explain;
        this.code = code;
    }
}

从上述代码可知,在 enum 枚举类中完全可以像在普通 Class 里一样声明属性、构造函数以及成员方法。

四、专门用于枚举的集合类

一般习惯于使用诸如:HashMap 和 HashSet 等集合来盛放元素。而对于枚举,有专门的集合类: EnumSet 和 EnumMap

1️⃣EnumSet

EnumSet 是专门为盛放枚举类型所设计的 Set 类型。

2️⃣EnumMap

EnumMap 则是用来专门盛放枚举类型为 key 的 Map 类型。

### 枚举enum)在编程中的用法 枚举类型是一种用户自定义的数据类型,通常用于表示一组固定的常量集合。这种数据结构可以提高程序的可读性和可维护性[^2]。 #### Java 中的 Enum 使用 在 Java 中,`enum` 是一种特殊的类,它可以被看作是一个具有固定成员列表的类。这些成员通常是不可变的对象实例。由于 `enum` 的特性,它们可以直接用于 `switch` 语句中[^1]: ```java public class Main { public static void main(String[] args) { DayOfWeek day = DayOfWeek.MONDAY; switch (day) { case MONDAY: System.out.println("Start of the work week."); break; case FRIDAY: System.out.println("End of the work week."); break; default: System.out.println("Another day..."); } } enum DayOfWeek { MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY } } ``` 上述代码展示了如何利用 `enum` 定义一周的日子,并将其作为参数传递给 `switch` 语句来执行不同的逻辑操作。 #### C/C++ 中的 Enum 使用 在 C 和 C++ 编程语言里,`enum` 关键字主要用于创建一系列命名整数常量。尽管不像高级语言那样功能强大,但它仍然有助于增强代码清晰度和减少错误可能性[^3]: ```c #include <stdio.h> int main(void){ enum Color { RED=0xFF0000, GREEN=0x00FF00, BLUE=0x0000FF }; int selectedColor = GREEN; if(selectedColor == RED){ printf("#%X\n",RED); }else if(selectedColor == GREEN){ printf("#%X\n",GREEN); }else{ printf("#%X\n",BLUE); } return 0; } ``` 在这个例子中,我们定义了一个名为 `Color` 的枚举类型并初始化了一些颜色值。接着通过简单的条件判断打印出对应的颜色十六进制码。 #### Python 中的 Enum 使用 从 Python 3.4 开始引入了标准库模块 `enum` 来支持枚举类型的声明与使用;而在 Python 3.10 及之后版本,则进一步增强了内置的支持程度使其更接近传统意义上的枚举行为模式: ```python from enum import Enum class Season(Enum): SPRING = 'spring' SUMMER = 'summer' AUTUMN = 'autumn' WINTER = 'winter' def describe_season(season:Season)->str: match season.name.lower(): case "spring": description="Flowers bloom." case "summer": description="Sun shines brightly." case _ : description=f"{season.value.capitalize()} weather is here!" return f"In {season.name}, "+description print(describe_season(Season.SPRING)) ``` 这里演示了怎样借助于新加入的关键字 `match-case`(类似于其他语言里的 `switch`) 结合枚举变量一起工作以生成季节描述字符串。 --- ### 总结 无论是在哪种主流编程语言环境下,合理运用好枚举类型都能让我们的源代码变得更加直观易懂同时也降低了潜在风险因素的存在几率。以上分别介绍了几种不同风格的语言对于该特性的具体实践方法论及其优势所在之处.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JFS_Study

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值