2012-05-08 3 views
11

Rozważmy następujące dwa wiersze koduktóry ma lepszą wydajność:! Test = null lub wartość null = test

if (test ! = null) 

i

if (null != test) 

Czy jest jakaś różnica w dwóch powyższych stwierdzeń wydajności mądry? Widziałem wielu ludzi, którzy korzystali z nich później i kiedy zostali przesłuchani, mówią, że jest to najlepsza praktyka bez solidnego powodu.

+3

To jest duplikat http://stackoverflow.com/questions/2369226/null-check-in-java, z wyjątkiem tego, że ten używa! = Zamiast równych. –

+0

Podobne pytanie http://stackoverflow.com/questions/15518958/null-check-coding-standard/15519045 –

+0

Podczas gdy jesteśmy na temat najlepszych praktyk, możesz zacząć dodawać spacje między "jeśli" i " ("Łączenie tej mniejszej zmiany stylu kodu z konwencjami kodowania java sprawi, że nawet najdokładniejszy recenzent kodu (ja) nie będzie miał nic do powiedzenia na temat twoich instrukcji if.www.oracle.com/technetwork/java/javase/ documentation/codeconventions-142311.html # 449 – Russ

Odpowiedz

20

Bez różnicy.

Drugi to tylko dlatego, że C/C++, gdzie programiści zawsze wykonywali zadania zamiast porównywać.

E.g.

Podczas kompilacji java zostanie wygenerowany błąd kompilacji.

Więc ja osobiście wolę pierwszy z powodu czytelności, ludzie mają tendencję do czytania od lewej do prawej, które czytają jako if test is not equal to null zamiast null is not equal to test.

+0

Dziękujemy. Zaznaczę to jako odpowiedź –

2

Drugi wygląda dla mnie jak "warunek Yoda", tj. if(2 == x) ... i jest znacznie mniej czytelny.

3

Nie ma różnicy w wydajności, ale osobiście uważam, że drugi jest mylący.

1

Najlepszą praktyką jest unikanie podstawowych literówek, które będą pobierane przez najnowocześniejsze IDE, ponieważ czasami trzeba dokonywać porównań pomiędzy bardziej złożonymi typami, które nie są zerowe i kończą się przypadkowymi przypisaniami. Wzorzec pozostaje taki sam, ale nigdy nie widziałem, aby było to związane z wydajnością i nigdy nie widziałem, by generował specjalny kod bajtowy.

Chodzi o to, aby najpierw uzyskać statyczną, znaną wartość, więc nie można wyrzucić żadnego dziwnego wyjątku podczas wykonywania porównania.

Żadna z tych metod nie jest "bardziej poprawna", więc decyzja, co chcesz użyć, należy wyłącznie do Ciebie.

20

Są dokładnie takie same. Drugi może mieć sens w przypadku korzystania wynosi:

if("bla".equals(test)) 

nigdy nie może rzucić NullPointerException następuje:

if(test.equals("bla")) 

puszkę.

+0

Dzięki +1. To ma sens –

1

nie ma różnicy. Ale w drugiej kolejności unikasz literówki takiej jak test = null. Beacause w drugi sposób dostaniesz błąd kompilatora.

+0

O ile "test" nie jest obiektem typu java.lang.Boolean, otrzymasz błąd kompilatora również w pierwszym przypadku: Object test = null; \t \t if (test = null) { \t \t \t // nie kompiluje się. Nie można przekonwertować obiektu Oject na wartość logiczną \t \t} – Polygnome

1

To nie jest najlepsza praktyka, aby użyć tej drugiej. Oba są równoważne, ale ten pierwszy jest łatwiejszy do odczytania.

Ta "najlepsza praktyka" pochodzi z C, gdzie boolean nie istnieje. Zamiast nich używane są liczby całkowite, a if (foo = 1) nie jest błędem składni, ale jest całkowicie inny niż if (foo == 1).

W języku Java tylko wyrażenia logiczne mogą znajdować się wewnątrz wyrażenia if, co nie ma większego sensu.

0

Nie ma naprawdę różnicy między dwiema postaciami. Nie ma problemu z wydajnością, ale istnieją następujące uwagi:

  • Pierwsza forma jest czytelna dla czytnika kodów, ponieważ ludzie zwykle czytają kody od lewej do prawej.
  • Druga forma jest lepsza dla kodu pisarza, ponieważ w java = operator jest do przypisania i == operator jest równoważny test, ale ludzie zwykle używając w if rachunku = zamiast == przez drugiego approch deweloper coraz Compile-Time-Error ponieważ zerowy nie może użyj w Left-Side instrukcji przypisania.