一行java代码及其作用?

Sou*_*lly 7 java string setter equals

所以我已经购买了"Java for Dummies"第4版,我必须说这可能是我花在书上的最好的30美元.我不是新编码,如果我自己这样说,我实际上相当不错.

但是,我遇到了一行让我感到困惑的代码:

public void setName(String n)
{
     if(!n.equals(""))
     {
          name = n;
     }
}
Run Code Online (Sandbox Code Playgroud)

我的问题出现在第三行,if(!n.equals(""))部分......我知道if循环是如何工作的(即:if(this == that that){do stuff}),但是我之前没见过!n.equals("").有人可以向我解释一下吗?

PS:只是想猜一猜.它是否相同:

public void setName(String n)
{
     if(n != "")
     {
          name = n
     }
}
Run Code Online (Sandbox Code Playgroud)

我认为这只是一种方法,以确保如果用户没有输入名称(即myAccount.setName ="";)它不会回复错误并像正常一样运行,但我不确定.

在此先感谢您的帮助!

编辑:改变了我的"myAccount.name ="";" 到"myAccount.setName ="";",抱歉混淆.

谢谢你:去Asaph,感谢答案!和Lucas Aardvark一样,他回答说,但Asaph先回答了我在他自己的回答中的验证评论,感谢所有人!

ddy*_*yer 9

在java中,字符串是不可变的但不是实例化的,因此如果(""== n)对于".equals(n)为真的另一个字符串可能会或可能不成立.

只是为了让你更加困惑,这是错误的代码,如果调用null作为参数,它将获得NullPointerException.它应该写成"".equals(n)

  • 在这种情况下,你的建议会产生更糟糕的代码:`"".equals(n)`其中`n == null`返回`false`,因此`(!"".equals(n))`计算为`true`这意味着他将`null`分配给`name`.`NullPointerException`实际上比消耗的错误更可取.在这种情况下,`NullPointerException`实际上是所需的响应.编码"防御性"并消耗"null"引用意味着代码被破坏的调用者永远不会发现它.用户不能输入"null",这意味着代码被破坏,因此应该抛出"异常". (2认同)

Asa*_*aph 5

if(!n.equals(""))
{
     name = n;
}
Run Code Online (Sandbox Code Playgroud)

表示如果n不是空String,则将其值赋给name.

在Java中,每个Object都有一个equals(Object o)方法来测试与另一个Object的相等性.==运算符通常用于比较基元.它也可以用于比较对象的"相同性".即.这两个对象实际上是同一个实例.这对于诸如字符串之类的不可变类型以及诸如Integer和Long之类的基本类型的所有Object包装器都很方便.

  • @Tom:`n.isEmpty()`仅适用于Java 1.6及更高版本. (4认同)
  • 将它与您感兴趣(或不感兴趣)的特定字符串进行比较要清楚得多.`!n.isEmpty()`可能更好.实际上更好的是为非法值抛出`IllegalArgumentException`. (3认同)