1.2 在switch语句中使用字符串

对于switch语句,开发人员应该都不陌生。大部分编程语言中都有类似的语法结构,用来根据某个表达式的值选择要执行的语句块。对于switch语句中的条件表达式类型,不同编程语言所提供的支持是不一样的。对于Java语言来说,在Java 7之前,switch语句中的条件表达式的类型只能是与整数类型兼容的类型,包括基本类型char、byte、short和int,与这些基本类型对应的封装类Character、Byte、Short和Integer,还有枚举类型。这样的限制降低了语言的灵活性,使开发人员在需要根据其他类型的表达式来进行条件选择时,不得不增加额外的代码来绕过这个限制。为此,Java 7放宽了这个限制,额外增加了一种可以在switch语句中使用的表达式类型,那就是很常见的字符串,即String类型。

1.2.1 基本用法

在基于Java 7的代码中使用这个新特性非常简单,因为这个新特性并没有改变switch的语法含义,只是多了一种开发人员可以选择的条件判断的数据类型。但是这个简单的新特性却带来了重大的影响,因为根据字符串进行条件判断在开发中是很常见的。

考虑这样一个应用情景,在程序中需要根据用户的性别来生成合适的称谓,比如男性就使用“×××先生”,女性就使用“×××女士”。判断条件的类型可以是字符串,如“男”表示男性,“女”表示女性。不过这在Java 7之前的switch语句中是行不通的,之前只能添加额外的代码先将字符串转换成整数类型。而在Java 7中就可以根据字符串进行条件判断,如下面的代码清单1-1所示。

代码清单1-1 在switch语句中使用字符串的示例


public class Title{

public String generate(String name, String gender){

String title="";

switch(gender){

case"男":

title=name+"先生";

break;

case"女":

title=name+"女士";

break;

default:

title=name;

}

return title;

}

}


在上面的代码中,Title类的generate方法中的switch语句以传入的字符串参数gender作为判断条件,在对应的case子句中使用的是字符串常量。

注意 在switch语句中,表达式的值不能是null,否则会在运行时抛出NullPointerException。在case子句中也不能使用null,否则会出现编译错误。

根据switch语句的语法要求,其case子句的值是不能重复的。这个要求对字符串类型的条件表达式同样适用。不过对于字符串来说,这种重复值的检查还有一个特殊之处,那就是Java代码中的字符串可以包含Unicode转义字符。重复值的检查是在Java编译器对Java源代码进行相关的词法转换之后才进行的。这个词法转换过程中包括了对Unicode转义字符的处理。也就是说,有些case子句的值虽然在源代码中看起来是不同的,但是经词法转换后是一样的,这就会造成编译错误。代码清单1-2给出了一个例子。

代码清单1-2 switch语句的case子句包含重复值的示例


public class TitleDuplicate{

public String generate(String name, String gender){

String title="";

switch(gender){

case"男":

break;

case"\u7537":

break;

}

return title;

}

}


在上面的代码中,类TitleDuplicate是无法通过编译的。这是因为其中的switch语句中的两个case子句所使用的值“男”和“\u7537”在经过词法转换之后变成一样的。“\u7537”是“男”的Unicode转义字符形式。