Każda z nich ma zalety i rozumiem różnice, ale co uważa się za najlepszą / standardową praktykę? I dlaczego?
Na przykład :
"myString".equals(myStringVar)
- Unika potencjalnego NPE i nie wymaga kontroli zerowej. (Dobra rzecz?)
- Czystszy do odczytu, ponieważ kontrola zerowa nie jest wymagana.
- Jeśli wartość null nie jest wartością oczekiwaną, Twój program może się zepsuć, nie będąc mądrzejszym.
jednak
myStringVar.equals("myString")
- Wymaga sprawdzenia wartości null, czy wartość null jest wartością oczekiwaną. (Dobra rzecz?)
- Może zagracać złożone warunki warunkowe za pomocą kontroli zerowej.
- Pozwala NPE powiadomić nas, jeśli coś się zepsuło.
Którą odmianę uważa się za standard do użycia w Javie i dlaczego?
java
programming-practices
coding-standards
BrandonV
źródło
źródło
Odpowiedzi:
Podejrzewam, że wynika to ze środków bezpieczeństwa stosowanych podczas programowania w starszym C (lub C ++). W C możesz przypadkowo przypisać wartość, jeśli chcesz przetestować równość:
Ten warunek zawsze będzie spełniony, ponieważ jest to przypisanie x wartość 3, a nie testowanie, że x jest równe 3. Aby uniknąć tych subtelnych błędów, programiści zaczęli odwracać warunek:
Zawiera ten sam „błąd”, ale generuje błąd kompilatora, więc jest bezpieczniejszy.
Bardziej nowoczesne języki nie mają tego problemu i mogą z łatwością cię ostrzec, gdy próbujesz robić tego rodzaju rzeczy. W związku z tym nie jest to czysta preferencja, więc wybierz jedną i używaj jej konsekwentnie.
źródło
equals
. W przeciwieństwie do C problem w Javie polega na tym, że wyrażeniex.equals(y)
wyrzuci NPE, gdyx
ma wartość NULL. Jeśli masz dosłowny ciąg znaków"something"
i chcesz uznać przypadeknull
za „nie równy”, warto napisać,"something".equals(y)
jeśli nie wiesz, czyy
może być zerowy. To nigdy nie rzuci NPE.Standardowe i dobre praktyki różnią się w zależności od kultury organizacji, w której pracujesz
Nasz standard w .NET wynika
myStringVar == "myString"
po prostu z tego, że się na to zgodziliśmy, tzn. Uważamy, że jest czysty i ugodowyUwaga: Nie dotyczy to Java ze względu na
==
porównywanie referencji zamiast samych obiektów. W Javie powinieneś używaćmyStringVar.equals("myString")
.źródło
==
ponieważ porównuje tylko odwołania do obiektów. To powiedziawszy, +1 za setiment - konwencja często określa „właściwy” sposób robienia rzeczy.myStringVar == "myString"
jest to bardzo zły pomysł na Javę (chyba że masz absolutną pewność, żemyStringVar
został internowany).Myślę, że masz rację, ponieważ zależy to od semantyki nieważności zmiennej. Jeśli nie spodziewasz się, że będzie zerowy i nie będziesz musiał go sprawdzać i obsługiwać, to pierwsza forma jest czystsza.
To powiedziawszy, zamiast osadzać dosłowny ciąg znaków, lepszym rozwiązaniem byłoby prawdopodobnie:
Zwłaszcza jeśli istnieje możliwość użycia łańcucha w większej liczbie miejsc niż jeden.
źródło