java - java 中的可调/变量开关案例

标签 java variables switch-statement

我有很多如下所示的方法:

switch(myEnum) {
    case a :
    case b :
    case c :
    case d :
        modifier = 1.1;
        break;
    default :
        break;
}

如果我有机会制作每种情况和修饰符变量,那就完美了,这样我就可以拥有一个带有 6 个参数的方法,其中 4 个用于情况,2 个用于修饰符。类似于以下内容(伪):

public void setModifier(case1, case2, case3, case4, modifier, value) {
    switch(myEnum) {
        case case1 :
        case case2 :
        case case3 :
        case case4 :
            modifier = value;
            break;
        default :
            break;
    }
}

修饰符和值应该不是问题,但是如何解决变量切换情况?这在 Java 中用 switch 语句可能吗?

最佳答案

这种方法存在多个问题:

  • 您无法更改传递的参数值,从而更改调用代码的值(在 Java 中,除了像 AtomicReference 等这样的持有者类型)。
  • 由于可能的重用而尝试使代码通用并不总是一个好主意,这往往会创建复杂的通用代码而不是可读的特定代码。
  • 看起来您的代码大部分都是 if,那么为什么要注意这样写呢?

如果我正确理解您的代码片段,我会尝试以下内联方法:

if (EnumSet.of(a, b, c, d).contains(myEnum)) {
  modifier = 1.1;
}

从我的角度来看,这更干净,因此不需要以通用方式提取它,并且非常灵活(任何数量的枚举值和任何可能的操作)。

如果您确实需要这样的方法,函数式接口(interface)可以完成这项工作:

setModifier(myEnum, () -> modifier = 1.1, a, b, c, d);

public <E extends Enum<E>> void setModifier(E current, Runnable action, E... allowed) {
  Arrays.stream(allowed)
      .filter(one -> one == current)
      .findAny()
      .ifPresent(found -> action.run());
}

正如您所看到的,这会创建更多的代码,如果不经常在类中传播,则这些代码是不必要的。由于隐式最终行为,上面的代码仅适用于作为成员的 modifier,而不是局部变量。

关于java - java 中的可调/变量开关案例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37894533/

相关文章:

Java 8 流 - 如何正确制作 NPE 安全流

java - 构建保险箱时 Maven 编译错误

java - 如何使用两种方法打印出星号?

jquery - 从变量 jquery 中删除字符串的一部分

string - 从分隔字符串构建对象的最佳方法(希望不是循环情况)

java - 无法在 java 中使用 Google Gson 解析此内容

tsql - SQL Server 变量的微妙之处

javascript - 何时使用 this.var 和 var = ;在 javascript 函数 obj 中?

coldfusion - Coldfusion在交换机中调用另一种情况

c# - 如何将多个案例连接到 switch 语句中