这两个选项中哪一个更好?
if(obj.getType!=null && obj.getData()!=null)
{
// Do something
}
elseif(obj.getData==null)
{
// Do other thing
}
*OR*
if(obj.getType!=null)
{
if(obj.getData!=null)
{
// Do something
}
else
{
// Do other thing
}
}
主要的疑点是为什么要以第一种方式对getData进行两次空检查?第二个选项只执行一次。
答案 0 :(得分:2)
这两个选项略有不同。在第一个选项中,无论elseif(obj.getData==null)
是否为空,都将执行object.getType
部分。但是,在第二个选项中,仅当object.getType
不为空时才会执行该块。所以,我认为这取决于你的要求。
答案 1 :(得分:2)
这取决于你需要什么。
考虑您有一项要求,规定您收集代表大于0的值的2个数据点,并且您必须就是否以及哪些值无效提供反馈。
public Data(int x, int y)
{
if (x <= 0 || y <= 0) {
throw new IllegalArgumentException("Invalid data provided, got (x: %d, y:%d)", x, y);
}
}
请注意,检查null然后检查条件是一种称为空值保护的相当正常的模式。
public void setValue(SomeValue o) {
if (o == null || o.Value <= 0) {
// code to handle bad value
}
}
另一方面,如果您有一组需要按顺序检查的条件,并且如果不满足条件则失败,您可以(not recommended)使用链式if
s就像你有:
public void someOperation()
{
if (condition)
{
if (condition2)
{
if (condition3)
{
// operation here
}
}
}
}
请注意,虽然您没有明确提及控制语句以外的其他内容,但如果您的情况类似于前面的示例,我会强烈建议通过反转来重构条件检查,如果检查很复杂,将它们重构为返回boolean
的方法。
public void someOperation()
{
if (!condition)
{
// code to fail out
}
if (!condition2)
{
// code to fail out
}
if (!complexCondition())
{
// code to fail out
}
// operation here
}
答案 2 :(得分:2)
在第一个示例中,对于getData的空检查不是总是两次完成。无论如何,只能确保完成。 &&
运算符检查左边条件是否为真(if obj.getType != null)
,并且仅当它是,是否继续检查第二个(if obj.getData() != null)
。 &&
和||
是懒惰的运算符。如果他们在检查第一个条件后可以确定整个布尔语句的值,那么他们就不会继续检查其他语句 - 与&
或|
不同。
除非满足外部条件,否则第二个版本不会检查obj.getData
值。如果不是,你永远不会到达第二个街区。