【问题标题】:What's the difference between "Foo".equals(maybeFoo) and maybeFoo==null?false:maybeFoo.equals("Foo")?"Foo".equals(maybeFoo) 和 maybeFoo==null?false:maybeFoo.equals("Foo") 有什么区别?
【发布时间】:2016-09-19 12:03:28
【问题描述】:

我面临一个问题,要编写一段 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.中maybeFoo的方法是什么?
  • 您的第二个选项也可以是return maybeFoo!=null && maybeFoo.equals("Foo");。
  • 我认为这些选项是面试官给出的
  • return Objects.equals(maybeFoo, "Foo") 怎么样?这是另一种方式,也是一种干净的方式。

标签: java equals strong-typing


【解决方案1】:

首先应该说两个版本都提供相同的输出,并且没有一个抛出异常,所以只是哪个是更干净的写法。

return "Foo".equals(maybeFoo);

是执行指定操作的更好方法,因为即使 maybeFoo 为 null,java 函数 equals 也会返回 false 并且不会引发异常。

但是,如果maybeFoo 为空,则不能对其调用函数equals,否则会得到NullPointerException。因此,您必须在第二个示例中检查它。

关键是,如果您可以使用 less 和 cleaner 代码使某些东西工作,那么您应该这样做,因为这会使您的代码更具可读性并且不易错误。

【讨论】:

  • “是一种更好的方法” 这只是一个意见;P。 “但是,如果 maybeFoo 是假的” 这是不可能的。 “更清洁的代码” 称 yoda 条件为“更清洁”也是一种观点(imo 不好)
  • 意思是明显地说空,而不是假。解决了这个问题。我看不出如何通过使用已定义的 java 函数的属性来消除对额外空值检查的需要,因此缩短代码并不是一种“更干净”的代码编写方式。
  • 取决于你的关系,做null,如果null是一个有效值。有人认为null 不应用作有效值,因为它主要意味着编程错误。当您默默地通过测试并且您不知道原因时,这将保持隐藏状态,因为您认为 maybeFoo 应该 包含 "Foo" (more about avoiding null)。
  • 我真的不能跟着你。面试官提供给他的两个选项都产生完全相同的输出。如果您输入 null 作为参数 - 无论是错误的还是因为它可能是一个有效值 - 函数都会返回 false。它们都不会抛出异常或其他任何东西来表明可能存在编程错误。所以这就是面试官指定问题的方式。您所说的通常是正确的(这就是为什么您通常应该检查函数的输入以查看它是否实际有效),但是,这里不需要。
  • 嗯,是的,我的意思更笼统,这里的这个问题不匹配。
【解决方案2】:

它们之间的区别正是您在 2 个选项中所写的

"Foo".equals(maybeFoo);

是一种最常见的实施检查,因为您不必关心空检查...(即使只是多了一个检查)

另一方面

maybeFoo.equals("Foo") 

会因为调用空引用对象的方法而引发 NPE 异常

【讨论】:

  • 但是no.2首先检查的是null。
  • 是的,我明白了,但是你检查的东西越少越好。
猜你喜欢
  • 1970-01-01
  • 2010-12-12
  • 2015-03-08
  • 2018-07-01
  • 2017-06-23
  • 2011-06-15
  • 1970-01-01
  • 2011-07-26
  • 1970-01-01
相关资源
最近更新 更多