我有很多如下所示的方法:
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/