Java Switch语句
最后修改:2020年8月6日
1.概述
在本教程中,我们将学到什么开关声明是如何使用它。
这开关声明允许我们替换几个嵌套如果别的构造,从而提高代码的可读性。
开关已经进化了随着时间的推移 - 已经添加了新的支持类型,特别是在Java 5和7中。此外,它还继续发展 -开关表达式很可能会在Java 12中引入。
下面我们将给出一些代码示例来演示开关声明,作用的作用打破声明,要求的要求开关参数/情况下价值与比较细绳年代一个开关声明。
让我们继续前进。
2.使用示例
假设,我们有以下嵌套如果别的声明:
公共字符串exampleofif(String Animal){String结果;if(Animal.equals(“狗”)|| Animal.Equals(“猫”)){结果=“家畜”;}否则如果(动物)(“虎”)){结果=“野生动物”;}否则{结果=“未知的动物”;}返回结果;}
上面的代码看起来不太好,并且很难维护和推理。金宝搏官网188be为了提高可读性,我们可以利用开关在此处的声明:
public String exampleOfSwitch(String animal) {String result;切换(动物){案例“狗”:结果=“家畜”;打破;案例“猫”:结果=“家畜”;打破;case "TIGER": result = "野生动物";打破;默认值:result = "未知动物";打破;}返回结果; }
如上所示,我们比较开关论点动物与几个情况下值。如果没有情况下值等于实参,则块下默认执行标签。
简单地说,打破语句用于退出开关声明。
3.打破陈述
虽然大多数开关在现实生活中,只有一个陈述暗示情况下块应执行,休息声明是退出的必要条件开关块完成后。
如果我们忘了写a打破,下面的块将被执行。
展示这让我们省略了打破语句,并将每个块的输出添加到控制台:
public String forgetBreakInSwitch(String animal) {switch (animal) {case "DOG": System.out。println(“家畜”);默认值:system . out。println(“未知的动物”);}}
让我们来执行这段代码forgetBreakInSwitch(“狗”),并检查输出,以证明所有的块都被执行了:
家畜未知的动物
所以我们应该小心并添加打破除非需要通过下一个标签下的代码,否则每个块末尾的语句。
唯一一个打破不是必要的是最后一个,但是添加一个打破到最后一个块使得代码越来越容易出错。
我们也可以利用这种行为省略打破当我们想为多个case语句执行相同的代码时。让我们将前2个案例分组在上一节中重写示例:
public String exampleOfSwitch(String animal) {String result;switch (animal) {case "DOG": case "CAT": result = "家畜";打破;case "TIGER": result = "野生动物";打破;默认值:result = "未知动物";打破;}返回结果;}
4.开关争论和情况下值
现在让我们讨论允许的类型开关参数,情况下价值观,对它们的要求以及如何开关语句适用于字符串。
4.1。数据类型
类中的所有对象和原语类型都不能进行比较开关声明。一种开关只适用于四个原语及其包装器,以及枚举类型和细绳班级:
- 字节和字节
- 短的和短的
- int和整数
- 字符和字符
- 枚举
- 细绳
细绳类型可在开关与Java 7开始的声明。
枚举类型在Java 5中引入,并已提供开关此后声明。
自Java 5以来,包装器类也已经可用。
当然,开关参数,情况下值应该是相同类型的。
4.2。没有零值
我们不能通过零值作为参数开关陈述。如果我们这么做,程序就会崩溃NullPointerException,使用我们的第一个开关例子:
@test(预期= nullpointerexception.class)public void whenswitchagagumentisnull_thennullpointerexception(){string amage = null;断言,S.Exampleofswitch(动物));}
当然,我们也不能通过零作为一个值情况下A的标签开关声明。如果我们这样做,代码将无法编译。
4.3。情况下值作为编译时间常量
如果我们试着替换狗具有变量的案例值狗属性之前,代码不会编译狗变量,最终的:
最终的狗=“狗”;字符串猫=“cat”;切换(动物){案例狗://编译结果=“家畜”;案例CAT://不编译结果=“Feline”}
4.4。细绳比较
如果一个开关语句使用相等操作符来比较不能比较的字符串细绳论点创建新操作员到一个细绳情况下正确值。
幸运的是,这开关操作员使用equals ()引擎盖下的方法。
让我们证明这一点:
@test public void whencomparestrings_thenbyequal(){String Amale = New String(“狗”);assertequals(“家畜”,s.exampleofswitch(动物));}
5。开关表达式
JDK 13.现在是否可用并带来了最初引入的新特性的改进版本JDK 12.: 这开关表达。
为了启用它,我们需要通过-Enable-preview.到编译器。
5.1。新开关表达式
让我们看看有什么新消息开关表达式看起来像当切换到月:
var result = switch(month) {case JANUARY, JUNE, JULY -> 3;案例2、9、10、11、12月-> 1;案例3月、5月、4月、8月-> 2;默认- > 0;};
发送一个类似于月。6月将结果至3.
注意,新语法使用->操作员而不是我们习惯的冒号开关语句。另外,没有打破关键词:开关表达不会崩溃情况下s。
另一个附加的事实是,我们现在可以使用逗号分隔的条件。
5.2。这收益率关键字
进一步进一步进一步,可以通过使用代码块来获得对表达式右侧发生的事情的细粒度控制。在这种情况下,我们需要使用关键字收益率:
var result = switch (month) {case JANUARY, JUNE, JULY -> 3;案例2、9、10、11、12月-> 1;case MARCH, MAY, APRIL, AUGUST -> {int monthLength = month.toString().length();yield monthLength * 4;} default -> 0;};
虽然我们的示例有点随意,但这里的重点是我们可以访问更多的Java语言。
5.3。回到里面开关表达式
由于两者的区别开关语句和开关表达,这是可能的返回在A内开关语句,但是我们不允许在a中这样做开关表达。
以下示例非常有效,并将编译:
switch (month) {case JANUARY, JUNE, JULY -> {return 3;} default ->{返回0;}}
但是,正如我们正在尝试的那样,以下代码不会编译返回封闭式开关表达式之外:
var result = switch (month) {case JANUARY, JUNE, JULY -> {return 3;} default ->{返回0;}};
5.4。穷举
使用时开关语句,如果所有案件都被涵盖并不重要。
例如,下面的代码是完全有效的,可以编译:
开关(月){案例1月,6月,7月 - > 3;案例2月、9月-> 1;}
为了开关表达式,编译器坚持所有可能的情况都包括在内。例如,以下代码片段不会编译,因为没有默认情况而不是所有可能的情况:
var result = switch (month) {case JANUARY, JUNE, JULY -> 3;案例2月、9月-> 1;}
这开关然而,表达式在所有可能的情况下都是有效的,如下面的例子:
var result = switch (month) {case JANUARY, JUNE, JULY -> 3;案例2、9、10、11、12月-> 1;案例3月、5月、4月、8月-> 2;}
请注意,上面的代码片段没有一个默认的情况。只要所有的情况都包括在内开关表达式将有效。
6.结论
在本教程中,我们学习了使用开关Java中声明。我们可以决定是否使用开关基于可读性和比较值的类型。
当我们在预定义的集合中有有限数量的选项时,Switch语句是一个好的候选者,因为我们在预定义的集合中有限(例如:星期几)。否则,我们必须每次添加或删除新值时修改代码,这可能是不可行的。对于这些案件,我们应该考虑其他方法,如多态性或者其他的设计模式,比如命令。