我有2个boolean
个变量,例如:
boolean isWhite;
boolean isTall;
所以我想确定4种可能情况({(isWhite, isTall), (!isWhite, isTall), (isWhite, !isTall), (!isWhite, !isTall)}
)的不同行为。
1)与每次使用if/else
相比,是否有更优雅实用的方法?
if(isWhite) {
if(isTall) {
// Case 1
}
else {
// Case 2
}
else {
if(isTall) {
// Case 3
}
else {
// Case 4
}
2)是否做这样的事情有什么不同呢?
if (isWhite && isTall)
// Case 1
if (isWhite && !isTall)
// Case 2
if (!isWhite && isTall)
// Case 3
if (!isWhite && !isTall)
// Case 4
答案 0 :(得分:6)
您的第二个解决方案更具可读性。但是你应该使用if-else而不仅仅是if语句。考虑第一种情况是否已经成立。还将计算其他3个if语句。如果使用if-else语句并且第一种情况为真,则只会跳过其他3条语句。
if (isWhite && isTall) {//case1}
else if (isWhite && !isTall) {//case2}
else if (!isWhite && isTall) {//case3}
else {//case4}
答案 1 :(得分:4)
我更喜欢第一个if / else安排,除非你可以使用enum
说你的布尔是a
和b
enum Combination {
A_B, NA_B, A_NB, NA_NB;
}
其中NA_NB不是A,而不是B.
switch(comb) {
case A_B:
//
break;
// more cases
case NA_NB:
//
break;
}
如果你有更多的布尔值,它会更好地扩展,它也可以使组合变得更加清晰。
这有助于完全删除if / else块。
enum Combination implements Actionable {
A_B {
public void action(Arg arg) {
// something
}
},
NA_B {
public void action(Arg arg) {
// something
}
},
A_NB {
public void action(Arg arg) {
// something
}
},
NA_NB {
public void action(Arg arg) {
// something
}
};
}
现在,您只需拨打
,而不是if / else或开关actionable.action(something);
您还可以轻松添加组合,可能是不属于原始库的自定义Actionable
。
答案 2 :(得分:2)
另一个替代方案是将它们转换为var temperature = "some text 565.34 °C other text".match(/(\d+|\d+\.\d+)\s*°C/)[1]*1;
if (temperature > -273.15 && temperature < 1000) {
console.log("valid temperature")
}
s(即0和1)并使用int
语句来识别所有场景,例如:
switch
答案 3 :(得分:0)
另一种可能性是直接从布尔值计算你的caseNumber:
int caseNumber = 1 + (isWhite ? 0 : 2) + (isTall ? 0 : 1);
这是example:
import java.util.*;
import java.lang.*;
import java.io.*;
class Ideone
{
public static void main (String[] args) throws java.lang.Exception
{
System.out.println(getCaseNumber(true,true));
System.out.println(getCaseNumber(true,false));
System.out.println(getCaseNumber(false,true));
System.out.println(getCaseNumber(false,false));
switch(getCaseNumber(true,false)){
case 1:
System.out.println("Case 1!");
break;
case 2:
System.out.println("Case 2!");
break;
case 3:
System.out.println("Case 3!");
break;
case 4:
System.out.println("Case 4!");
break;
}
}
private static int getCaseNumber(boolean bool1, boolean bool2)
{
return 1 + (bool1 ? 0 : 2) + (bool2 ? 0 : 1);
}
}
输出:
1
2
3
4
Case 2!
迭代所有可能性更容易,使用n布尔值可以更好地扩展,并且使用switch
语句更容易使用。
1 +
仅用于匹配您的案例定义,其中(true,true)
为Case 1
。
如果您希望在caseNumber
和0
之间2**n-1
,则可以将其删除。
答案 4 :(得分:0)
这是一种常见的模式,其中属性通过某些业务逻辑(在现实世界中建立)定义不同的情况。
这种控制流很难测试,验证,以跟踪来自的错误。
最好的方法是使其或多或少成为声明性列表。 也许远程类似:
{ false, false, (isWhite, isTall) -> { ... } },
{ false, true, (isWhite, isTall) -> { ... } },
{ true, false, (isWhite, isTall) -> { ... } },
{ true, true, (isWhite, isTall) -> { ... } },
(使用枚举更易读。)
通过这种方式,您可以创建插件(带案例的XML),更好地记录(处理程序类名称)。特别是这个声明性列表可以作为业务逻辑的规范,可由客户读取。因此,如果为拾取的处理程序提供以某种形式向用户显示的字符串ID +版本,那将是正常的。例如PDF格式的表单版本。
这意味着更改代码设计。但是在许多类似报道的例子中帮助了我。
答案 5 :(得分:0)
这个怎么样?与之前的答案类似,但在处理布尔值不具有相同值的两个实例时,我使用Func<List<T>> fillFirstList = () => Fill(() => default(T), MapSize[2]);
Func<List<List<T>>> fillSecondList = () => Fill(fillFirstList, MapSize[1]);
Map.AddRange(Fill(fillSecondList, MapSize[0]));
缩短了我的代码。
else if
为您节省一点打字:)