7.1.1 基本枚举

7.1.1 基本枚举

首先以学校的学科为例,定义一个简单的枚举类型。

动手写 7.1.1 DefineEnum

定义枚举的方式是在enum关键字后确定枚举类型的名字。花括号中定义枚举类型的可能值,枚举类型中至少包含一个case语句,即至少有一个枚举的可能值,本例中有六个枚举值。现在Subject被定义好了,可以将其当作数据类型来使用,就像Int和String一样。

一般自定义类型的名字以大写字母开头。如果需要用到多个单词,就用帕斯卡(Pascal)命名法,像“PascalCase”一样,每个单词的首字母大写,而变量、函数以及自定义类型的成员一般以小写字母开头。如果需要用到多个单词的话,就用驼峰命名法,像“camel Cased”一样,除了第一个单词外,其他每个单词的首字母大写。定义好一个新的枚举类型之后,就可以创建这个枚举类型的实例对象了。

动手写7.1.2 CreateEnumObject

控制台输出如下:

示例中显式地声明了subject1是一个Subject枚举类型,并且赋值为Chinese,打印结果如预期一样。在这里要注意的是编译器其实可以自己推断类型,所以这里的枚举实例对象还可以这样声明:

此外,编译器对枚举的类型推断能力不仅仅是在变量声明上体现,如果一个变量已经能推断出是某个枚举类型,那么可以在给变量再次赋值时省略枚举的类型名。比如在刚才示例的基础上增加subject3的定义:

控制台输出如下:

编译器强大的类型推断能力还能在下次使用这个变量的时候体现,如果这里对subject3进行值判断时,也可以省略枚举类型名:

控制台输出如下:

唯一要注意的是:如果选择使用编译器的类型推断,那么在声明一个枚举变量的时候就要初始化它的值,这样才能让编译器推断出来。

在之前的章节中,我们已经学习了switch语句,可以说switch加上enum是一个完美的组合。下面将使用switch语句进行学科的判断:

动手写7.1.3 SwitchEnumValue

控制台输出如下:

在之前章节讲到switch语句时,我们强调过,switch一定要覆盖所有的可能性,所以这个示例中,在未写完所有可能的情况下,还是增加了一个default分支。但是对于枚举变量的switch其实可以不用default,因为编译器能够知道枚举的所有可能性。那么读者可以删除default分支,并在编译器的帮助下将缺失的分支补全:

控制台输出如下:

需要读者注意的是,在switch判断的变量是一个枚举类型时,建议不使用default分支。因为在未来的扩展中,很可能会增加枚举中的可能值,不使用default分支会使编译器知道代码中有哪些地方没有对新增的可能值进行处理,这是一种安全的做法。