"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。因此,您必须在第二个示例中检查它。

关键是,如果您可以使用 lesscleaner 代码来实现某些功能,那么您应该使用它,因为这使得您的代码更易读,更不容易出错。