Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 爪哇语:;xx";。equals(variable)比variable好。equals(";xx";),对吗?_Java_Equals_Manual - Fatal编程技术网

Java 爪哇语:;xx";。equals(variable)比variable好。equals(";xx";),对吗?

Java 爪哇语:;xx";。equals(variable)比variable好。equals(";xx";),对吗?,java,equals,manual,Java,Equals,Manual,我正在审阅一本最佳实践和推荐编码java的手册,我认为这是值得怀疑的 推荐: String variable; "xx".equals(variable) // OK variable.equals("xx") //Not recomended 因为防止出现不受控制的NullPointerException 这是真的吗?是真的。如果您的示例中变量为空 variable.equals("xx"); 将抛出NPE,因为您无法对空对象调用方法(equals)。但是 "xx".equals(va

我正在审阅一本最佳实践和推荐编码java的手册,我认为这是值得怀疑的

推荐:

String variable;

"xx".equals(variable) // OK

variable.equals("xx") //Not recomended
因为防止出现不受控制的NullPointerException


这是真的吗?

是真的。如果您的示例中
变量

variable.equals("xx");
将抛出NPE,因为您无法对空对象调用方法(
equals
)。但是

"xx".equals(variable);

将只返回
false
而不会出错。

这是Java(和C#)程序中使用的一种常见技术。第一种形式避免了null指针异常,因为对常量字符串
“xx”
调用了
.equals()
方法,该字符串从不为null。与空字符串相比,非空字符串为false


如果您知道
variable
永远不会为null(如果它为null,那么您的程序在其他方面是不正确的),那么使用
variable.equals(“xx”)
就可以了。

实际上,我认为最初的建议是正确的。如果使用
variable.equals(“xx”)
,则如果
variable
为空,则会得到
NullPointerException
。将常量字符串放在左侧可以避免这种可能性


<> P>由你来决定,这种防御是否值得许多人认为不自然的习语的痛苦。

如果你需要检查<代码> null <代码>,我发现它比你读起来更好。


if(variable!=null&&variable.equals(“xx”))
。这更多的是个人偏好的问题。

确实,以这种方式使用对象的任何属性都有助于避免NPE

但这就是为什么我们有例外,来处理这类事情


也许如果你使用“xx”。等于(变量),你永远不会知道变量的值是空的还是不等于“xx”。在我看来,最好知道您的变量中有一个空值,这样您就可以重新分配它,而不是忽略它。

这是一种非常常见的技术,如果变量为空,则会导致测试返回false,而不是抛出一个
NullPointerException
。但我想我会有所不同,我不会认为这是一个你应该一直遵循的建议

  • 我绝对认为这是所有Java程序员都应该知道的,因为这是一个常见的习惯用法
  • 这也是一种使代码更简洁的有用技术(您可以同时处理null和notnull情况)
但是:


  • 这会使您的代码更难阅读:
  • 如果您刚刚检查了前一行中的参数是否为null,那么就没有必要了
  • 如果您忘记了测试null,而有人提供了一个null参数,而您并不期望它,那么
    NullPointerException
    不一定是最糟糕的结果。假装一切正常,直到最终失败,这并不是一个更好的选择。快速失败是好事

就我个人而言,我不认为在所有情况下都需要使用这种技术。我认为应该让程序员根据具体情况作出判断。重要的是确保您以适当的方式处理了null案例,并且如何处理取决于具体情况。检查空值的正确处理可能是测试/代码审查指南的一部分。

< P>您对检查的顺序是正确的——如果变量为NULL,调用。在字符串常量上等于等于防止NPE——但我不确定我认为这是个好主意;我个人称之为“slop”

Slop是指当你没有发现异常情况,但事实上却养成了习惯来避免被发现。将null作为字符串传递一段较长的时间,最终将导致可能不清楚且难以找到的错误

slop编码与“Fail fast Fail hard”相反

使用null作为字符串有时会产生一个很好的“特殊”值,但是您试图将其与某个东西进行比较的事实表明您对系统的理解是不完整的(最多)——越早发现这个事实越好


另一方面,默认情况下使所有变量为最终变量,使用泛型并最小化所有对象/方法的可见性是降低斜率的习惯。

作为旁注,这里有一个设计模式,其中此代码建议可能没有任何区别,因为字符串(即
可选的
)永远不会因为.isPresent()而为空来自设计模式的调用:

Optional<String> gender = Optional.of("MALE");
if (gender.isPresent()) {
    System.out.println("Value available.");
} else {
    System.out.println("Value not available.");
}
gender.ifPresent(g -> System.out.println("Consumer: equals: " + g.equals("whatever")));
Optional gender=Optional.of(“男性”);
if(gender.isPresent()){
System.out.println(“可用值”);
}否则{
System.out.println(“值不可用”);
}
gender.ifPresent(g->System.out.println(“Consumer:equals:”+g.equals(“任意”));

如果你在写一本技术手册,你需要担心的语法问题比像这样的一个小的编码警告更大。@Zak,这不是真正相关的。你怎么知道手册是英文的?也许Xerg能流利地用其他语言书写,并且正在用这种语言编写手册。每个回答的人都设法弄明白问题的症结所在。我没有写任何手册。我只是看看。请原谅我的英语,我是一个比作家更好的读者。我发现“Yoda版本”很难阅读,但它确实避免了空指针异常。另一种选择是'的=null&&s.equals(“xx”)”,这更容易键入,并且需要额外几纳秒来进行额外的比较。@Tom:嗯,也许吧。我曾经遇到过这样的情况,在这种情况下,它应该是一个错误,而在其他许多情况下,它不应该是错误。事实上,我同意Mark Byers的观点,即在个案基础上对其进行评估是有意义的。“这会使代码更难阅读:“如果蓝色是天空……”——否则称为yoda条件-