我试图一劳永逸地简化一个共同的条件:
public static void main(String[] args)
{
boolean a = true;
boolean b = false;
boolean c = true;
boolean t1 = (a && b) || (!a && c);
boolean t2 = a ? b : c;
System.out.println(t1);
System.out.println(t2);
}
显然,t1
和t2
是等效的。
有没有办法,使用运算符优先级来表示条件而不使用三元运算符并仅评估a
一次?
由于
真实世界的例子:
if(execution.isActive() ? !Objects.equals(sourceStep, currentStep) : sourceStep != null)
{
throw new IllegalStateException("current action is not allowed to be executed");
}
其中execution.isActive()
是一项昂贵的操作。
根据我的口味,这根本不可读......我必须停下来思考,它不会立竿见影。
我的问题是可读性 vs 效率。
答案 0 :(得分:2)
在现实生活中,如果a实际上是一个昂贵的电话的结果,我只是把它提取到一个变量。
改变这个:
boolean t1 = (expensiveCall() && b) || (!expensiveCall() && c);
到此:
boolean result = expensiveCall();
boolean t1 = (result && b) || (!result && c);
但除此之外:我认为使用三元运算符没有任何问题。
答案 1 :(得分:1)
如果我希望代码更容易阅读,我宁愿这样做:
private boolean isIllegalAction(execution,sourceStep,currentStep){
return execution.isActive() ? !Objects.equals(sourceStep, currentStep) : sourceStep != null;
}
if(isIllegalAction(...)){
//do something
}
答案 2 :(得分:1)
我的问题是可读性与效率
很好。
考虑:
int result = (myObject.isCompleted())
? myObject.getStandardError()
: myObject.computeStandardError().getStandardError();
...与:相比:
int result = 0;
if (myObject.isCompleted()) {
result = myObject.getStandardError();
}
else {
result = myObject.computeStandardError().getStandardError();
}
我会说内联if-then-else更具可读性,不是吗?