Java交换机用例

Java交换机用例,java,switch-statement,multiple-return-values,Java,Switch Statement,Multiple Return Values,我不愿意使用开关,但我看到了 Java12添加了开关表达式作为实验特性。Java开关表达式是可以返回值的开关语句 我发现(Java 12之前)switch可能有用的唯一用例是从一个小的封闭用例集中返回不同的值,例如: switch (input) { case "A": return "1"; case "B": return "2"; default: return "0"; } 或者在Java 12示例

我不愿意使用开关,但我看到了

Java12添加了开关表达式作为实验特性。Java开关表达式是可以返回值的开关语句

我发现(Java 12之前)switch可能有用的唯一用例是从一个小的封闭用例集中返回不同的值,例如:

    switch (input) {
    case "A":
        return "1";
    case "B":
        return "2";
    default:
        return "0";
    }
或者在Java 12示例中:

但我发现了一个古老但排名很高的语句,它说要避免多个返回语句:

将一个值赋给局部变量,然后在最后返回该值被认为是一种良好的做法。具有多个出口的方法更难调试,也更难读取

所以我想知道,由于开关的改变,这个答案仍然相关吗

我必须等待Java12在没有临时变量和中断的情况下使用开关吗

将一个值赋给局部变量,然后在最后返回该值被认为是一种良好的做法

我不知道什么时候它被认为是一种好的做法。对我来说,
开关
通常是一个设计错误的指示器。我宁愿把精力放在思考如何避免切换上,也不想知道如何从切换返回值

几个例子



具有多个出口的方法更难调试,也更难读取

同样的道理也适用于一个有大量中断的方法——如果你选择“局部变量方法”,那就是你要做的

在我看来,这些都不是

// 1
switch (input) {
    case "A":
        return "1";
    case "B":
        return "2";
    default:
        return "0";
}

// 2
String varibleToReturn = null;
switch (input) {
    case "A":
        varibleToReturn = "1";
        break;
    case "B":
        varibleToReturn = "2";
        break;
    default:
        varibleToReturn = "0";
}
return varibleToReturn;

// 3
return switch(digitInDecimal) {
    case  0 -> '0';
    case  1 -> '1';
    case  2 -> '2';
    default -> '?';
}
产生显著的不同,或轻微的改善。是的,Java-12的切换将提供更多的简洁性和表达性,但基本思想保持不变

我必须等待Java12在没有临时变量和中断的情况下使用开关吗

这是什么意思?:)不,截止日期是明天,你必须用手头上的东西工作


*我并没有低估开关的作用。例如,当您在低级编程或编写优化时,它可能会派上用场


我只是说,在现实世界中,在有弹簧和休眠的模式世界中,switch已经过时了。

这个答案为多返回语句提供了很好的论据:。我认为这真的是一个风格的问题,它是否使代码更混乱或更少。教条式的理想很少在任何情况下都是好的。例如,使用带有返回语句的开关可以是实现工厂的一种很好的方法。当然,它是相关的-什么改变了?没什么-只是语法。仍然存在多个,调试器仍将执行相同的操作。Java中的一些东西可能更简单,但仍然很简单Java@MarcBaumbach我同意,在一个封闭的小集合中cases@m.antkowiczJava12语法允许您避免多个返回语句“删除”返回词不是“避免多个返回语句”;)请想一想-调试器将如何处理它?我理解您的观点,但如果switch总是设计错误,那么java为什么要努力增强它呢?
switch总是一个设计错误的指示器
-我不同意。您并不总是在创建一个庞大、灵活的libr…ekhm解决方案。开发人员总是有责任理解并决定何时使用诸如
switch
之类的东西,以及何时实现一些命令模式等等。为什么人们如此不喜欢switch语句?它最大的好处之一是能够创建跳转表,与许多ifs相比,跳转表的性能是巨大的,跳转表允许在O(1)时间内到达任何给定情况(必须进行单个额外字符串比较的字符串除外)。@user7294900“现有switch声明中的一些违规行为——长期以来一直令用户恼火——成为了障碍。其中包括开关块的默认控制流行为(fall-through)、开关块的默认作用域(该块被视为一个单一作用域)以及开关仅作为语句工作,尽管通常更自然地将多路条件表示为表达式。“来源:@user7294900语言设计师不关心你如何编写代码,他们关心语言如何允许你编写代码(语言的表达力、简洁性和灵活性如何)
// 1
switch (input) {
    case "A":
        return "1";
    case "B":
        return "2";
    default:
        return "0";
}

// 2
String varibleToReturn = null;
switch (input) {
    case "A":
        varibleToReturn = "1";
        break;
    case "B":
        varibleToReturn = "2";
        break;
    default:
        varibleToReturn = "0";
}
return varibleToReturn;

// 3
return switch(digitInDecimal) {
    case  0 -> '0';
    case  1 -> '1';
    case  2 -> '2';
    default -> '?';
}