C, C++, Java 和 Python 中的 Enum

枚举类是很多编程语言中都有的设计. 它最明显的用途在于给一系列编程中概念相关的但逻辑上在同一层次的事物编号.

大多数编程语言从,枚举类的定义语法类似类, 也就是说它们都将枚举类看成是一个特殊的类。同时, 它们一般允许定义的枚举名称在作用范围内按照整型常量随意使用. 还提供了自定义编号的特性.

C

基本语法

enum 枚举类名{
枚举名1,
枚举名2,
...
枚举名n
};

如果需要自定义编号, 采用枚举名 = 整型常量表达式的形式定义枚举名, 此时下一个枚举名的编号是整型常量表达式 + 1.

Java

在 Java 中,枚举类就是一种继承了 java.lang.Enum, 实现了 java.lang.Comparable 的 final 类, 可以定义类能定义的属性和方法.

枚举类可以有构造方法,默认私有.

基本语法

enum 枚举类名{
// 所有实例都必须在开头定义. 默认以public static final修饰.
枚举名1,
枚举名2,
...
枚举名n
}

注意啦,这里的枚举名们都可看作是枚举类的实例在初始化, 因此可以提供构造函数的参数.

常用的方法

  • String toString()
  • final String name()
  • static final int valueOf(String name)
  • static String[] values()
  • final int ordinal()
  • final int compareTo(E o)

定义抽象方法

如果写抽象方法,枚举类的所有实例都必须实现抽象方法.

每个枚举名都是 Abstract枚举类名的对象的引用, 因此可以通过在初始化参数后接内部类定义来实现抽象方法.

编译后,所有实例都是内部类.

Python

Python 语法更加直接, 枚举类就是一个继承了 enum.Enum 的类.

基本语法

class 枚举类名(enum.Enum):
枚举名1,
枚举名2,
...
枚举名n

Todo

C++

C 语言的枚举类名是无范围修饰的,因此经常会出现枚举名撞车现象, 给 debug 带来无穷麻烦.

因此 C++ 添加了一些新的语法来避免这一切.

enum (class|struct) 枚举类名[:编号类型]{

};

另外增加了 using enum 枚举类名来导入某个枚举类.