W Javie, co jest bardziej zalecane i dlaczego? Oba typy będą zgłaszać wyjątki, więc ich obsługa jest taka sama. assert
jest nieco krótszy, ale nie jestem pewien, ile to ma znaczenie.
public void doStuff(Object obj) {
assert obj != null;
...
}
vs
public void doStuff(Object obj) {
if (obj == null) {
throw new IllegalArgumentException("object was null");
}
...
}
java
exceptions
conventions
Daenyth
źródło
źródło
obj.hashCode()
;-)Odpowiedzi:
STRZEC SIĘ!
Asercje są usuwane w czasie wykonywania, chyba że jawnie określisz opcję „włącz asercje” podczas kompilowania kodu. Asercji Java nie należy używać w kodzie produkcyjnym i należy ją ograniczyć do metod prywatnych (patrz Wyjątek vs. asercja ), ponieważ oczekuje się, że metody prywatne będą znane i używane tylko przez programistów. Również
assert
rzuci AssertionError która rozciąga sięError
nieException
, a które zazwyczaj oznacza, że masz bardzo nienormalne błąd (jak „OutOfMemoryError”, które jest trudne do odzyskania od, prawda?), Nie oczekuje się, aby móc leczyć.Usuń flagę „włącz asercje” i sprawdź za pomocą debugera, a zobaczysz, że nie nadepniesz na wywołanie wyrzucenia IllegalArgumentException ... ponieważ ten kod nie został skompilowany (ponownie po usunięciu „ea”)
Lepiej jest użyć drugiej konstrukcji do metod publicznych / chronionych, a jeśli chcesz czegoś, co jest zrobione w jednym wierszu kodu, jest co najmniej jeden sposób, który znam. Ja osobiście korzystam z klasy Spring Framework ,
Assert
która ma kilka metod sprawdzania argumentów i która generuje błąd „IllegalArgumentException” w przypadku niepowodzenia. Zasadniczo to, co robisz, to:... Który faktycznie wykona dokładnie ten sam kod, który napisałeś w drugim przykładzie. Istnieje kilka innych przydatnych metod, takich jak
hasText
,hasLength
tam.Nie lubię pisać więcej kodu niż to konieczne, więc cieszę się, gdy zmniejszam liczbę zapisanych linii o 2 (2 linie> 1 linia) :-)
źródło
java -ea
i programowo. @Jalayn Myślę, że posiadanie asercji w kodzie produkcyjnym jest całkowicie poprawne, ponieważ są one przydatne do debugowania w tereniejava -ea
.Objects.requreNonNull
Musisz użyć wyjątku. Użycie asercji byłoby niewłaściwym użyciem tej funkcji.
Niezaznaczone wyjątki służą do wykrywania błędów programowych użytkowników biblioteki, podczas gdy twierdzenia mają na celu wykrywanie błędów we własnej logice. Są to osobne problemy, których nie należy mieszać.
Na przykład twierdzenie
oznacza „Wiem, że każda ścieżka kodu prowadząca do tego stwierdzenia zapewnia, że
myConnection
jest on połączony; jeśli powyższy kod nie uzyskał prawidłowego połączenia, powinien zgłosić wyjątek lub powrócić przed osiągnięciem tego punktu”.Z drugiej strony czek
oznacza, że „Wywołanie mojej biblioteki bez nawiązania połączenia jest błędem programowania”.
źródło
Jeśli piszesz funkcję, która nie dopuszcza
null
jako prawidłowej wartości parametru, należy dodać@Nonnull
adnotację do podpisu i użyć,Objects.requireNonNull
aby sprawdzić, czy argument jest,null
i wyrzucić,NullPointerException
jeśli tak jest.@Nonnull
Adnotacja jest dla dokumentacji i dostarczy pomocnych ostrzeżeń w czasie kompilacji w niektórych przypadkach. Nie zapobieganull
przekazywaniu w czasie wykonywania.Aktualizacja:
@Nonnull
adnotacja nie jest częścią standardowej biblioteki języka Java. Zamiast tego istnieje wiele konkurujących standardów z bibliotek stron trzecich (patrz Której adnotacji @NotNull Java należy użyć? ). To nie znaczy, że używanie go jest kiepskim pomysłem, tylko że nie jest to standard.źródło
Objects.requireNonNull()
, co było dla mnie nowe. Czy wiesz, czy jest gdzieś podobna metoda „needTrue ()” lub „requEqual ()”? Nic wbrew twierdzeniom Springa, ale nie wszyscy tego używają.Objects.requireNonNull()
jest do sprawdzania poprawności argumentów. Jeśli argument musi byćtrue
równy lub równy, argument jest bezcelowy. W przypadkach, o błędach innych niż nielegalnych argumentów, należy które dokładniej opisuje błąd. Istnieje również JUnit, ale to jest do testów.throw
Exception
Assert
Objects.requireTrue(x >= 0.0);
lub jakiegoś skrótu,Objects.requireEquals(hash.length == 256)
Zawsze wolę rzucić IllegalArgumentException zamiast twierdzeń.
Asercje są używane głównie w JUnit lub innych narzędziach testujących do sprawdzania / potwierdzania wyników testów. Może to dawać fałszywe wrażenie innym programistom, że twoja metoda jest metodą testową.
Sensowne jest także zgłoszenie wyjątku IllegalArgumentException, gdy do metody przekazano niedozwolony lub niewłaściwy argument . Jest to bardziej zgodne z konwencją obsługi wyjątków stosowaną przez programistów Java.
źródło
IMO drugi jest nieco lepszy, ponieważ przynosi więcej informacji i może być dalej rozszerzany (np. Poprzez rozszerzenie klasy wyjątków), aby był jeszcze bardziej pouczający, a także nie używa porównania negatywnego, które jest łatwiejsze do zrozumienia.
źródło
Nie używam często asertów, ale wspólne podejście z Lombock @NonNull: https://projectlombok.org/features/NonNull
Implementacja Lombok: import lombok.NonNull;
Wersja Java:
Lombok to naprawdę niezła biblioteka, z której korzystam wszędzie
źródło