use*_*985 28 java if-statement short ternary-operator
我有一个检查空值的方法.有没有办法减少方法中的行数?目前,代码看起来"脏":
private int similarityCount (String one, String two) {
if (one == null && two == null) {
return 1;
} else if (one == null && two != null) {
return 2;
} else if (one != null && two == null) {
return 3;
} else {
if(isMatch(one, two))
return 4;
return 5;
}
}
Run Code Online (Sandbox Code Playgroud)
Man*_* Le 61
private int similarityCount (String one, String two) {
if (one == null && two == null) {
return 1;
}
if (one == null) {
return 2;
}
if (two == null) {
return 3;
}
if (isMatch(one, two)) {
return 4;
}
return 5;
}
Run Code Online (Sandbox Code Playgroud)
Era*_*ran 33
在这种情况下,我更喜欢嵌套条件:
private int similarityCount (String one, String two) {
if (one==null) {
if (two==null) {
return 1;
} else {
return 2;
}
} else {
if (two==null) {
return 3;
} else {
return isMatch(one, two) ? 4 : 5;
}
}
}
Run Code Online (Sandbox Code Playgroud)
当然,您可以通过使用更多的三元条件运算符来实现更短的版本.
private int similarityCount (String one, String two) {
if (one==null) {
return (two==null) ? 1 : 2;
} else {
return (two==null) ? 3 : isMatch(one, two) ? 4 : 5;
}
}
Run Code Online (Sandbox Code Playgroud)
甚至(现在这变得越来越不可读):
private int similarityCount (String one, String two) {
return (one==null) ? ((two==null) ? 1 : 2) : ((two==null) ? 3 : isMatch(one, two) ? 4 : 5);
}
Run Code Online (Sandbox Code Playgroud)
Kon*_*lph 25
由于函数的实际目的似乎是null通过匹配它们来处理非对象,所以我将null在开头处理一个guard语句中的所有检查.
然后,一旦你确定没有参数null,你就可以处理实际的逻辑:
private int similarityCount(String a, String b) {
if (a == null || b == null) {
return a == b ? 1 : a == null ? 2 : 3;
}
return isMatch(a, b) ? 4 : 5;
}
Run Code Online (Sandbox Code Playgroud)
这比其他选项更简洁,更易读.
也就是说,实际函数通常不会返回这样的数字代码.除非你的方法被简化以证明问题,否则我强烈建议你重新考虑逻辑,而是写下类似于下面的内容:
private boolean similarityCount(String a, String b) {
if (a == null || b == null) {
throw new NullPointerException();
}
return isMatch(a, b);
}
Run Code Online (Sandbox Code Playgroud)
要么:
private boolean similarityCount(String a, String b) {
if (a == null) {
throw new IllegalArgumentException("a");
}
if (b == null) {
throw new IllegalArgumentException("b");
}
return isMatch(a, b);
}
Run Code Online (Sandbox Code Playgroud)
这些方法更为传统.另一方面,它们可能会触发异常.我们可以通过java.util.Optional<Boolean>在Java 8中返回来避免这种情况:
private Optional<Boolean> similarityCount(String a, String b) {
if (a == null || b == null) {
return Optional.empty();
}
return Optional.of(isMatch(a, b));
}
Run Code Online (Sandbox Code Playgroud)
乍一看,这似乎并不比回归更好,null但选择权实际上要优越得多.
代码对我来说看起来很清楚.您可以使用嵌套和三元运算符缩短它:
if(one==null) {
return two==null ? 1 : 2;
}
if(two==null) {
return 3;
}
return isMatch(one,two) ? 4 : 5;
Run Code Online (Sandbox Code Playgroud)
它可以使用Java条件运算符在一行中完成:
return (one==null?(two==null?1:2):(two==null?3:(isMatch(one,two)?4:5)));
Run Code Online (Sandbox Code Playgroud)
您可以创建一个伪查找表。有些人不喜欢嵌套的三元运算符,它高度依赖空格来提高可读性,但它可以是一种非常易读的条件返回方法:
private int similarityCount (String one, String two) {
return (one == null && two == null) ? 1
: (one == null && two != null) ? 2
: (one != null && two == null) ? 3
: isMatch(one, two) ? 4
: 5;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5361 次 |
| 最近记录: |