我有一个变量x
。
我希望仅在 m()
是两个可能值之一时调用方法x
。
调用m()
时,我想向其传递一个参数,其值取决于x
的值。
有没有办法在Java中执行此操作而不必多次检查x
的值,并且只在一个地方调用/写m()
(即不在{{1的多个分支中)声明)?
我很有趣的一个解决方案:
if
但我不禁觉得这是技术上两次检查switch (x) {
case 1:
y = "foo";
break;
case 2:
y = "bar";
break;
default:
y = null;
break;
}
if (y != null) m(y);
,只是通过为第二次检查添加“代理”来掩盖这一事实。
(澄清为什么约束是它们的原因:在阅读代码时,我很难理解在分支之间存在高度重复时分支很多的逻辑 - 它变成了“发现差异”的游戏而不是简单地能够看到正在发生的事情。我宁愿积极地重构这种重复,这是一种习惯,在Ruby,JS和其他语言中很好地服务于我;我希望我能学会为Java做同样的事情并使代码更容易让我和其他人一目了然。)
答案 0 :(得分:3)
我不确定你想做什么,但你可以使用地图来获得“' y'来自' x'
的参数Map<Integer, String> map = new HashMap<>();
map.put(1, "foo");
map.put(2, "bar");
if (map.containsKey(x)) {
m(map.get(x));
}
答案 1 :(得分:1)
使用“转到”或等效物:
void do_m_if_appropriate() {
// x and y are assumed to be eg. member variables
switch (x) {
case 1:
y = "foo";
break;
case 2:
y = "bar";
break;
default:
return; // this is the "goto equivalent" part
}
m(y);
}
上面很优雅。如有必要,将其更改为返回true
或false
也是微不足道的,具体取决于它是m()
还是y
还是null
。
你也可以用循环结构做一些技巧,虽然有些人可能会说这是滥用循环结构,你应该相应地评论它:
do { // note: not a real loop, used to skip call to m()
switch (x) {
case 1:
y = "foo";
break;
case 2:
y = "bar";
break;
default:
continue; // "goto equivalent" part
}
m(y);
} while(false);
答案 2 :(得分:1)
以下是Optionals的解决方案(我的Java语法可能稍微不正确)。请注意,对于您来说,代码看起来是这样,但实现明智,它类似于您发布的示例(即检查y是否为异常值)。
switch (x) {
case 1:
y = Optional<String>.of("foo");
break;
case 2:
y = Optional<String>.of("bar");
break;
default:
y = Optional<String>.empty();
break;
}
y.map((m's class)::m);
result = y.orElse( <value result should take if x was invalid> );
实际上,最好修改m()以返回一个Optional,如果y无效则返回空,但我假设您要检查调用方。
答案 3 :(得分:-1)
为什么不
switch (x) {
case 1:
y = "foo";
m(y);
break;
case 2:
y = "bar";
m(y);
break;
}