1.2.3 枚举类型

以笔者的个人观点来看,Java 7引入的这个新特性虽然为开发人员提供了方便,但是比较容易被误用,造成代码的可维护性问题。提到这一点就必须要说一下Java SE 5.0中引入的枚举类型。switch语句的一个典型的应用就是在多个枚举值之间进行选择。比如代码清单1-1中的性别枚举值“男”和“女”,或者是一个星期中的每一天。在Java SE 5.0之前,一般的做法是使用一个整数来为这些枚举值编号,比如0表示“男”,1表示“女”。在switch语句中使用这个整数编码来进行判断。这种做法的弊端有很多,比如不是类型安全的、没有名称空间、可维护性差和不够直观等。Joshua Bloch最早在他的《Effective Java》一书中提出了一种类型安全的枚举类型的实现方式。这种方式在J2SE 5.0中被引入到标准库,就是现在的enum关键字。

Java语言中的枚举类型的最大优势在于它是一个完整的Java类,除了定义其中包含的枚举值之外,还可以包含任意的方法和域,以及实现任意的接口。这使得枚举类型可以很好地与其他Java类进行交互。在涉及多个枚举值的情况下,都应该优先使用枚举类型。

在Java 7之前,也就是switch语句还不支持使用字符串表达式类型时,如果要枚举的值本身都是字符串,使用枚举类型是唯一的选择。而在Java 7中,由于switch语句增加了对字符串条件表达式的支持,一些开发人员会选择放弃枚举类型而直接在case子句中用字符串常量来列出各个枚举值。这种方式虽然简单和直接,但是会带来维护上的麻烦,尤其是这样的switch语句在程序的多个地方出现的时候。在程序中多次出现字符串常量总是一个不好的现象,而使用枚举类型就可以避免这种情况。

对此,笔者的建议是,如果代码中有多个地方使用switch语句来枚举字符串,就考虑用枚举类型进行替换。