【问题标题】:object==null or null==object?对象==空或空==对象?
【发布时间】:2019-07-30 17:54:09
【问题描述】:

我从某人那里听说null == objectobject == null 好检查

例如:

void m1(Object obj ) {
   if(null == obj)  // Is this better than object == null ? Why ?
       return ;
   // Else blah blah
}

有什么原因还是这是另一个神话? 感谢您的帮助。

【问题讨论】:

标签: java null


【解决方案1】:

这可能是从 C 中学到的一个习惯,以避免这种错字(单个 = 而不是双 ==):

if (object = null) {

将常量放在== 左侧的约定在Java 中并不是很有用,因为Java 要求if 中的表达式计算为boolean 值,所以除非常量是@ 987654327@,无论您如何放置参数,都会出现编译错误。 (如果它是一个布尔值,你就不应该使用==...)

【讨论】:

    【解决方案2】:

    正如其他人所说,这是从 C 中学到的避免拼写错误的习惯——尽管即使在 C 中,我也希望体面的编译器具有足够高的警告级别来发出警告。正如 Chandru 所说,以这种方式与 Java 中的 null 进行比较只会在您使用 Boolean 类型的变量(您不在示例代码中)时引起问题。我想说这是一种非常罕见的情况,而且不值得改变你在其他地方编写代码的方式。 (即使在这种情况下,我也不会费心反转操作数;如果我想得足够清楚,可以考虑反转它们,我相信我可以数等号。)

    没有提到的是,很多人(当然包括我自己)发现if (variable == constant) 表格更易读——这是一种更自然的表达自己的方式。这是从 C 中盲目复制约定的原因。在假设在一种环境中可能有用的东西在另一种环境中有用之前,您应该始终质疑实践(就像您在这里所做的那样:)。

    【讨论】:

      【解决方案3】:

      这在 Java (1.5+) 中没有多大价值,除非对象类型是 Boolean。在这种情况下,这仍然很方便。

      如果对象是Booleanif (object = null) 在 Java 1.5+ 中不会导致编译失败,但会在运行时抛出 NullPointerException

      【讨论】:

      • 对于非布尔类型,代码不会编译,因为表达式“object = null”的类型不是布尔类型。由于自动装箱,它将编译为布尔值。
      【解决方案4】:

      在 Java 中没有充分的理由。

      其他几个答案声称这是因为您可能会不小心将其赋值而不是相等。但是在 Java 中,你必须在 if 中有一个布尔值,所以:

      if (o = null)
      

      不会编译。

      这在 Java 中唯一重要的是变量是否为布尔值:

      int m1(boolean x)
      {
          if (x = true)  // oops, assignment instead of equality
      

      【讨论】:

        【解决方案5】:

        这也密切相关:

        if ("foo".equals(bar)) {
        

        如果您不想处理 NPE,这很方便:

        if (bar!=null && bar.equals("foo")) {
        

        【讨论】:

          【解决方案6】:

          这个技巧应该可以防止v = null 的错别字。

          但是 Java 只允许布尔表达式作为 if() 条件,所以这个技巧没有多大意义,编译器无论如何都会找到这些拼写错误。

          不过,对于 C/C++ 代码来说,这仍然是很有价值的技巧。

          【讨论】:

            【解决方案7】:

            出于同样的原因,你在 C 中这样做;赋值是一个表达式,所以你把文字放在左边,这样如果你不小心使用=而不是==,你就不能覆盖它。

            【讨论】:

            • 不,Java 编译器会按照您喜欢的顺序捕捉这种错字
            【解决方案8】:

            这适用于喜欢将常量放在左侧的人。 在大多数情况下,左侧有常量将防止 NullPointerException 被抛出(或进行另一个 nullcheck)。例如,String 方法 equals 也会进行空检查。左边有常数,可以防止你写额外的检查。其中,以另一种方式也在稍后执行。左边的空值只是保持一致。

            喜欢:

             String b = null;
             "constant".equals(b);  // result to false
             b.equals("constant");  // NullPointerException
             b != null && b.equals("constant");  // result to false
            

            【讨论】:

              【解决方案9】:

              对比下面的代码:

                  String pingResult = "asd";
                  long s = System.nanoTime ( );
                  if ( null != pingResult )
                  {
                      System.out.println ( "null != pingResult" );
                  }
                  long e = System.nanoTime ( );
                  System.out.println ( e - s );
              
                  long s1 = System.nanoTime ( );
                  if ( pingResult != null )
                  {
                      System.out.println ( "pingResult != null" );
                  }
                  long e1 = System.nanoTime ( );
                  System.out.println ( e1 - s1 );
              

              输出(多次执行后):

              null != pingResult
              325737
              pingResult != null
              47027
              

              因此,pingResult != null 是赢家。

              【讨论】:

                【解决方案10】:

                由于其commutative propertyobject == nullnull == objectYoda version)之间的唯一区别在于认知性质:读者如何阅读和消化代码。虽然我不知道确切的答案,但我知道我个人更喜欢将我正在检查的对象与其他对象进行比较,而不是将其他对象与我正在检查的对象进行比较,如果那样的话有任何意义。从主题开始,然后是要与之比较的值。

                在其他一些语言中,这种比较风格更有用。

                不过,一般来说,为了防止丢失“=”符号,我认为写null == objectdefensive programming 的错误行为。绕过这个特定代码的更好方法是通过 junit 测试来保证行为。请记住,遗漏“=”的可能错误并不取决于方法的输入参数——您不依赖于其他人正确使用此 API——因此,junit 测试非常适合防止这种情况发生。无论如何,您将需要编写 junit 测试来验证行为;缺少的“=”自然属于范围。

                【讨论】:

                  【解决方案11】:

                  这是尤达条件的不同写法

                  在java中

                  String myString = null;
                  if (myString.equals("foobar")) { /* ... */ } //Will give u null pointer
                  

                  尤达条件

                  String myString = null;
                  if ("foobar".equals(myString)) { /* ... */ } // will be false 
                  

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 2012-11-19
                    • 2012-08-25
                    • 2013-11-12
                    • 2023-03-10
                    • 1970-01-01
                    • 2016-02-17
                    • 2015-11-20
                    相关资源
                    最近更新 更多