Java 枚举类用法、注意事项

维基百科定义:


  枚举(enum): 在数学和计算机科学理论中,一个集的枚举是列出某些有穷列集的所有成员的程序。枚举是一个被命名的整型常数的集合,枚举在日常生活中很常见,例如表示星期的 SUNDAY、MONDAY、TUESDAY、WEDNESDAY、THURSDAY、FRIDAY、SATURDAY 就是一个枚举。 

  项目中常用写法示例:

/**
 * 逻辑删除标志位枚举类
 * @author huangdingsheng
 * @date 2019/3/13 14:56
 */
public enum DeletedEnum {
    DELETED_STATUS("已删除", (byte) 1),
    NOT_DELETED_STATUS("未删除", (byte) 0);

    // 成员变量
    private String name;
    private Byte value;

    // 构造方法
    private DeletedEnum(String name, Byte value) {
        this.name = name;
        this.value = value;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Byte getValue() {
        return value;
    }

    public void setValue(Byte value) {
        this.value = value;
    }
}

 

  待补充,其它写法:

  常量

public enum ColorEnum {  
  RED, GREEN, BLANK, YELLOW  
} 

  

使用 Enum的注意事项

在使用 Enum 时候有几个地方需要注意:

  1. enum 类型不支持 public 和 protected 修饰符的构造方法,因此构造函数一定要是 private 或 friendly 的。也正因为如此,所以枚举对象是无法在程序中通过直接调用其构造方法来初始化的。
  2. 定义 enum 类型时候,如果是简单类型,那么最后一个枚举值后不用跟任何一个符号;但如果有定制方法,那么最后一个枚举值与后面代码要用分号';'隔开,不能用逗号或空格。
  3. 由于 enum 类型的值实际上是通过运行期构造出对象来表示的,所以在 cluster 环境下,每个虚拟机都会构造出一个同义的枚举对象。因而在做比较操作时候就需要注意,如果直接通过使用等号 ( ‘ == ’ ) 操作符,这些看似一样的枚举值一定不相等,因为这不是同一个对象实例。

jdk1.5之前,没有枚举的时候是什么样的?

 常量定义

1

2

3

4

5

6

7

8

9

10

11

Public static class RainbowColor {

    

   // 红橙黄绿青蓝紫七种颜色的常量定义

   public static final int RED = 0;

   public static final int ORANGE = 1;

   public static final int YELLOW = 2;

   public static final int GREEN = 3;

   public static final int CYAN = 4;

   public static final int BLUE = 5;

   public static final int PURPLE = 6;

}

使用的时候,你可以在程序中直接引用这些常量。但是,这种方式还是存在着一些问题。

  1. 类型不安全

由于颜色常量的对应值是整数形,所以程序执行过程中很有可能给颜色变量传入一个任意的整数值,导致出现错误。

  1. 没有命名空间

由于颜色常量只是类的属性,当你使用的时候不得不通过类来访问。

  1. 一致性差

因为整形枚举属于编译期常量,所以编译过程完成后,所有客户端和服务器端引用的地方,会直接将整数值写入。这样,当你修改旧的枚举整数值后或者增加新的枚举值后,所有引用地方代码都需要重新编译,否则运行时刻就会出现错误。

  1. 类型无指意性

由于颜色枚举值仅仅是一些无任何含义的整数值,如果在运行期调试时候,你就会发现日志中有很多魔术数字,但除了程序员本身,其他人很难明白其奥秘。

 

参考资料:

Java 语言中 Enum 类型的使用介绍 https://www.ibm.com/developerworks/cn/java/j-lo-enum/index.html

 

 

你可能感兴趣的:(Java基础)