`
k1280000
  • 浏览: 203639 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

枚举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的一些案例

    枚举Enum的一些案例 枚举(enum)是一种特殊的值类型,它从 System.Enum 继承而来,并为基础的基元类型的值提供替代名称。枚举类型有名称、基础类型和一组字段。基础类型必须是一个内置的有符号(或无符号)整数...

    枚举enum和switch 的使用

    枚举(Enum)作为编程语言中一种特殊的类型,为开发者提供了一种简洁、清晰的定义一组命名常量的方式。在C#语言中,枚举是通过`enum`关键字定义的,其本质上是一种结构体,与整型(int)紧密相关联,但提供了更丰富...

    java enum 枚举 学习资料

    "Java Enum 枚举学习资料" Java Enum 枚举学习资料是 Java 编程语言中的一种特殊类型,它主要用来实现一组固定的常量。 Enum 枚举类型是 Java 5 中引入的一种新特性,旨在解决传统的 int 枚举常量的缺陷。 1. 枚举...

    Java枚举类型Enum的用法

    Java枚举类型(Enum)是Java SE 5.0引入的一种新的数据类型,它为开发者提供了更为强大且安全的方式来表示一组常量。枚举在Java中不仅是一个类,还是一种特殊的类型,允许我们定义自己的常量集合。接下来,我们将...

    利用枚举enum编程进行博彩游戏的模拟(掷双骰子)

    利用自定的枚举类型,结合rand函数,结合C++编程进行博彩游戏的模拟(掷双骰子)

    浅谈Python 的枚举 Enum

    首先,定义枚举要导入enum模块。 枚举定义用class关键字,继承Enum类。 注意: 定义枚举时,成员名称不允许重复  默认情况下,不同的成员值允许相同。但是两个相同值的成员,第二个成员的名称被视作第一个成员的别名...

    Java SE程序 Enum枚举类

    Java SE程序 Enum枚举类Java SE程序 Enum枚举类Java SE程序 Enum枚举类Java SE程序 Enum枚举类Java SE程序 Enum枚举类Java SE程序 Enum枚举类Java SE程序 Enum枚举类Java SE程序 Enum枚举类Java SE程序 Enum枚举类...

    枚举语句enum用法详解

    枚举(enum)在编程语言中是一种非常有用的类型,它允许我们定义一组命名常量,这些常量通常代表一组相关的值。在C#中,枚举(enum)被广泛用于增强代码的可读性和可维护性。下面我们将深入探讨C#中的枚举用法。 一...

    C#与C调用C++Dll,非托管,含struct调用及enum公用,完整项目,可直接编译或运行

    C#与C调用C++,非托管,含struct调用及enum公用,完整项目,可直接编译或运行。 项目将所有工程的输出统一到Debug。 vs2015+Framework4.6,注意工程的配置。 所有东西自写,只是出于样例参考的作用,所以代码规范...

    c#遍历枚举(ENUM)类型的方法

    c#遍历枚举(ENUM)类型的方法,简单实用,适合c#初学者

    c代码-C:枚举 enum

    在C语言中,枚举(enum)是一种定义符号常量的数据类型,它允许我们为整数值赋予有意义的名称。这不仅提高了代码的可读性,还可以避免硬编码数字,从而减少错误的可能性。本文将深入探讨C语言中的枚举类型及其用法。...

    Java中的枚举类型Enum示例源代码

    Java中的枚举类型`Enum`是面向对象编程中一种强大的工具,它允许程序员定义自己的常量集合。在Java中,枚举类型不是简单的常量数组,而是一种完整的类,具有类的所有特性,如方法、构造函数和继承。下面将详细探讨`...

    C++中枚举类型(enum)

    ### C++中的枚举类型(Enum) 在C++编程语言中,枚举(`enum`)是一种用户定义的类型,它由一组具有整数值的命名常量组成。这些值可以被程序用来代替数字,使代码更具可读性,并且能够表示特定范围内的固定集合。 ...

    enum枚举的方法

    enum枚举的方法

    枚举的应用例题

    枚举(Enum)在编程语言中是一种非常重要的数据类型,它允许我们定义一组预定义的常量,这些常量通常代表特定的值或状态。枚举在很多编程场景下都有广泛的应用,例如在处理有限状态机、定义颜色、星期等具有固定数量...

Global site tag (gtag.js) - Google Analytics