programing tip

object == null 또는 null == object?

itbloger 2020. 8. 28. 07:07
반응형

object == null 또는 null == object?


수표 null == object보다 나은 사람에게서 들었어object == null

예 :

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

이유가 있습니까 아니면 이것은 또 다른 신화입니까? 도와 줘서 고마워.


이것은 아마도 이런 종류의 오타를 피하기 위해 C에서 배운 습관 일 것입니다 ( =double 대신 single ==) :

if (object = null) {

상수를 왼쪽에 두는 규칙은 ==Java에서 실제로 유용하지 않습니다. Java에서는 표현식의 표현식 ifboolean값으로 평가되어야하기 때문에 상수가이면 boolean어떤 식 으로든 컴파일 오류가 발생합니다. 인수. (그리고 그것이 부울이라면 ==어쨌든 사용해서는 안됩니다 ...)


다른 사람들이 말했듯이 오타를 피하기 위해 C에서 배운 습관입니다. C에서도 경고를 줄만큼 충분히 높은 경고 수준에서 괜찮은 컴파일러를 기대합니다. Chandru가 말했듯이 이러한 방식으로 Java에서 null과 비교하면 유형의 변수를 사용하는 경우에만 문제가 발생합니다 Boolean(샘플 코드에 없음). 이것은 매우 드문 상황이며 다른 곳에서 코드를 작성하는 방식을 변경할 가치가있는 상황은 아닙니다. (이 경우에도 피연산자를 뒤집는 것을 귀찮게하지 않을 것입니다. 그 반대를 고려할만큼 명확하게 생각하고 있다면 등호를 셀 수있을 것입니다.)

무엇 않은 언급하는 것은 많은 사람들이 (자신을 확실히 포함)을 찾을 수 있다는 것입니다 if (variable == constant)그것은 자신을 표현하는 자연스러운 방법 - 더 읽을 수 있도록 양식을. 이것이 C의 관례를 맹목적으로 모방 하지 않는 이유 입니다. 한 환경에서 유용 할 수있는 것이 다른 환경에서 유용하다고 가정하기 전에 항상 관행에 대해 질문해야합니다.


이것은 객체 유형이 인 경우를 제외하고는 Java (1.5+)에서 그다지 가치가 없습니다 Boolean. 어떤 경우에도 이것은 여전히 ​​편리 할 수 ​​있습니다.

if (object = null)객체가 있으면 Java 1.5 이상에서 컴파일 실패를 일으키지 Boolean않지만 NullPointerException런타임에 throw 됩니다.


자바에는 타당한 이유가 없습니다.

다른 몇 가지 답변은 평등 대신 실수로 할당 할 수 있기 때문이라고 주장했습니다. 그러나 Java에서는 if에 부울이 있어야합니다.

if (o = null)

컴파일되지 않습니다.

이것이 Java에서 문제가 될 수있는 유일한 경우는 변수가 부울 인 경우입니다.

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

이것은 또한 다음과 밀접한 관련이 있습니다.

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

NPE를 다루고 싶지 않은 경우 편리합니다.

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

이 트릭 v = null은 일종의 오타 를 방지하기위한 것입니다.

그러나 Java는 if()조건으로 부울 표현식 만 허용 하므로 트릭이별로 의미가 없으므로 컴파일러는 어차피 오타를 찾습니다.

그래도 C / C ++ 코드에서는 여전히 귀중한 트릭입니다.


같은 이유로 C에서 수행합니다. 할당은 표현식이므로 리터럴을 왼쪽에 배치하여 실수로 =대신을 사용하는 경우 덮어 쓰지 않도록합니다 ==.


그것은 왼쪽에 상수를 선호하는 사람들을위한 것입니다. 대부분의 경우 상수가 왼쪽에 있으면 NullPointerException이 throw되거나 다른 null 검사가 발생하지 않습니다. 예를 들어 String 메서드 equals는 null 검사도 수행합니다. 왼쪽에 상수가 있으면 추가 수표를 작성할 수 없습니다. 다른 방식으로도 나중에 수행됩니다. 왼쪽에 null 값이 있으면 일관성이 있습니다.

처럼:

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

다음 코드와 비교하십시오.

    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승자입니다.


Because of its commutative property, the only difference between object == null and null == object (the Yoda version) is of cognitive nature: how the code is read and digested by the reader. I don't know the definitive answer though, but I do know I personally prefer comparing the object I'm inspecting to something else, rather than comparing something else to the object I'm inspecting, if that makes any sense. Start with the subject, then the value to compare it to.

In some other languages this comparison style is more useful.

To safe guard against a missing "=" sign in general though, I think writing null == object is a misguided act of defensive programming. The better way around this particular code is by guaranteeing the behavior with a junit test. Remember, the possible mistake of missing an "=" is not dependant on the method's input arguments - you are not dependent on the right use of this API by other people - so a junit test is perfect to safe guard against that instead. Anyway you will want to write junit tests to verify the behavior; a missing "=" naturally falls within scope.


It is Yoda condition writing in different manner

In java

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

yoda condition

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

참고URL : https://stackoverflow.com/questions/2369226/object-null-or-null-object

반응형