"Foo".equals(maybeFoo) 和 maybeFoo==null?false:maybeFoo.equals("Foo") 有什么区别?
What's the difference between "Foo".equals(maybeFoo) and maybeFoo==null?false:maybeFoo.equals("Foo")?
我正面临着编写一段 java 代码的问题,例如:
boolean isFoo(String maybeFoo){
//Return true if maybeFoo is equal to "Foo"
//Don't throw any exceptions.
}
我有两个选择:
1. return "Foo".equals(maybeFoo);
2. return maybeFoo==null?false:maybeFoo.equals("Foo");
我选择了数字1,但我无法给出数字2错误的原因。我对面试官说,处理强类型语言只是我的习惯。但他似乎并不满足。
它们之间的区别正是您在 2 个选项中所写的内容
"Foo".equals(maybeFoo);
是最常见的实施检查,因为您不必关心空检查...(即使只多检查一次)
另一方面,这个
maybeFoo.equals("Foo")
将抛出 NPE 异常只是因为在空引用对象上调用方法
首先应该说这两个版本提供了相同的输出,其中 none 会抛出异常,所以这只是一个 cleaner 的问题写法。
return "Foo".equals(maybeFoo);
是执行指定操作的更好方法,因为即使 maybeFoo
为空,java 函数 equals
returns false
也不会不抛出异常。
但是,如果 maybeFoo
为 null,则不能对其调用函数 equals
,否则会得到 NullPointerException
。因此,您必须在第二个示例中检查它。
关键是,如果您可以使用 less 和 cleaner 代码来实现某些功能,那么您应该使用它,因为这使得您的代码更易读,更不容易出错。
我正面临着编写一段 java 代码的问题,例如:
boolean isFoo(String maybeFoo){
//Return true if maybeFoo is equal to "Foo"
//Don't throw any exceptions.
}
我有两个选择:
1. return "Foo".equals(maybeFoo);
2. return maybeFoo==null?false:maybeFoo.equals("Foo");
我选择了数字1,但我无法给出数字2错误的原因。我对面试官说,处理强类型语言只是我的习惯。但他似乎并不满足。
它们之间的区别正是您在 2 个选项中所写的内容
"Foo".equals(maybeFoo);
是最常见的实施检查,因为您不必关心空检查...(即使只多检查一次)
另一方面,这个
maybeFoo.equals("Foo")
将抛出 NPE 异常只是因为在空引用对象上调用方法
首先应该说这两个版本提供了相同的输出,其中 none 会抛出异常,所以这只是一个 cleaner 的问题写法。
return "Foo".equals(maybeFoo);
是执行指定操作的更好方法,因为即使 maybeFoo
为空,java 函数 equals
returns false
也不会不抛出异常。
但是,如果 maybeFoo
为 null,则不能对其调用函数 equals
,否则会得到 NullPointerException
。因此,您必须在第二个示例中检查它。
关键是,如果您可以使用 less 和 cleaner 代码来实现某些功能,那么您应该使用它,因为这使得您的代码更易读,更不容易出错。