枚举Enum

  1. 什么是枚举?
  2. 为什么要用枚举?
  3. 枚举可以怎么用?
  4. Pros VS Cons

 

1.什么是枚举

首先我们从一个枚举类的反编译文件来认识一下枚举类

Compiled from "ColorEnum.java"
public final class com.james.learning.j2se.enums.ColorEnum extends java.lang.Enum<com.james.learning.j2se.enums.ColorEnum> {
  public static final com.james.learning.j2se.enums.ColorEnum RED;

  public static final com.james.learning.j2se.enums.ColorEnum YELLOW;

  public static com.james.learning.j2se.enums.ColorEnum[] values();
    Code:
       0: getstatic     #1                  // Field $VALUES:[Lcom/james/learning/j2se/enums/ColorEnum;
       3: invokevirtual #2                  // Method "[Lcom/james/learning/j2se/enums/ColorEnum;".clone:()Ljava/lang/Object;
       6: checkcast     #3                  // class "[Lcom/james/learning/j2se/enums/ColorEnum;"
       9: areturn

  public static com.james.learning.j2se.enums.ColorEnum valueOf(java.lang.String);
    Code:
       0: ldc           #4                  // class com/james/learning/j2se/enums/ColorEnum
       2: aload_0
       3: invokestatic  #5                  // Method java/lang/Enum.valueOf:(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Enum;
       6: checkcast     #4                  // class com/james/learning/j2se/enums/ColorEnum
       9: areturn

  static {};
    Code:
       0: new           #4                  // class com/james/learning/j2se/enums/ColorEnum
       3: dup
       4: ldc           #7                  // String RED
       6: iconst_0
       7: invokespecial #8                  // Method "<init>":(Ljava/lang/String;I)V
      10: putstatic     #9                  // Field RED:Lcom/james/learning/j2se/enums/ColorEnum;
      13: new           #4                  // class com/james/learning/j2se/enums/ColorEnum
      16: dup
      17: ldc           #10                 // String YELLOW
      19: iconst_1
      20: invokespecial #8                  // Method "<init>":(Ljava/lang/String;I)V
      23: putstatic     #11                 // Field YELLOW:Lcom/james/learning/j2se/enums/ColorEnum;
      26: iconst_2
      27: anewarray     #4                  // class com/james/learning/j2se/enums/ColorEnum
      30: dup
      31: iconst_0
      32: getstatic     #9                  // Field RED:Lcom/james/learning/j2se/enums/ColorEnum;
      35: aastore
      36: dup
      37: iconst_1
      38: getstatic     #11                 // Field YELLOW:Lcom/james/learning/j2se/enums/ColorEnum;
      41: aastore
      42: putstatic     #1                  // Field $VALUES:[Lcom/james/learning/j2se/enums/ColorEnum;
      45: return
}

 

 

从前面一句可以看出来 

Compiled from "ColorEnum.java"
public final class com.james.learning.j2se.enums.ColorEnum extends java.lang.Enum<com.james.learning.j2se.enums.ColorEnum> {
 

a. ColorEnum是final的,不能被再继承,也就是之后状态不能被覆盖。

b. ColorEnum继承自Enum.

 

public static final com.james.learning.j2se.enums.ColorEnum RED;
public static final com.james.learning.j2se.enums.ColorEnum YELLOW;
public static com.james.learning.j2se.enums.ColorEnum[] values();

这里我们看到成员变量RED、YELLOW 其实是一个 ColorEnum。自动会增加一个 values的方法返回ColorEnum[] 。

 

2. 为什么要用枚举

从effective java里摘出来的,像

public static final int TOTAL = 10;

public static final String MSG = "message";

 这样的有以下几方面的问题:

      1. 编译期无法感知是否用错,像入参的话可以直接用数字代替,数字还能做加减,这样不是常量的本意。

      2. 如果是RPC,服务端的api里包含的常量,当服务端常量改变的时候,客户端需要跟着编译一次,当然也   可以不编译,但是做参数传递的话就会两端不一致。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

### 枚举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`) 结合枚举变量一起工作以生成季节描述字符串。 --- ### 总结 无论是在哪种主流编程语言环境下,合理运用好枚举类型都能让我们的源代码变得更加直观易懂同时也降低了潜在风险因素的存在几率。以上分别介绍了几种不同风格的语言对于该特性的具体实践方法论及其优势所在之处.
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值