我有时会有这些工作流程。
MyObj mo = null;
if (x == 1)
{
mo = foo ();
}
else if (x == 2)
{
...
}
else
{
mo = bar ();
}
我认为它不是很“漂亮”,并且有一个逻辑可能性(有更多的 if,也许没有其他)该对象将是未定义的。我必须处理好这个问题。
有什么办法可以让它变得更优雅吗?我认为对于如此简单的代码来说它相当长。
我不确定 case 语句或三元 if 是否会更好......
首先,如果要确保所有条件分支都赋值,只能在第一行声明一个final变量。这样,编译器就知道您的变量必须只分配一次,并且它可以检查 if/else 是否详尽:
final String myVar;
if (x == 0) myVar = "zero";
else if (x > 0) myVar = "positive";
else myVar = "negative";
此外,从 java 14 开始,您可以使用 switch statements 代替。它是一种特殊类型的开关,返回一个变量,由其一个分支分配(分支是互斥的)。
关于 switch 表达式的一些注意事项:
default
分支,您也可以使其详尽无遗,因为编译器随后能够检查是否已在 switch 中测试了所有可能的值。示例:
final String myVar = switch (x) {
case 0 -> "zero"
case 1 -> "one"
default -> "other"
};
您使用的 Java 版本是什么?如果您使用 JDK 14+,则可以使用
switch expressions
var x = 1;
Object mo = switch (x) {
case 1 -> new Object();
default -> new Object();
};
System.out.println(mo);
该对象将是未定义的。我必须处理好这个问题。
使用此语法,如果编译器检测到未处理所有情况,则需要
default
情况。否则你会得到错误The switch expression does not cover all possible input values
。
如果您处理了所有可能的值,则不需要
default
。
enum Type {
FOO,
BAR
}
var t = Type.FOO;
Object mo = switch (t) {
case FOO -> "f";
case BAR -> "b";
};
如果有一天您在枚举中添加一个值,您将需要修改代码来处理这个问题,这很好。