Jak wiesz, java.util.Objects
jest
Ta klasa składa się ze statycznych metod narzędziowych do wykonywania operacji na obiektach.
Jedną z takich metod jest Objects.isNull()
.
Rozumiem, Objects.isNull()
że wyeliminowałoby to możliwość przypadkowego przypisania wartości zerowej do obiektu poprzez pominięcie drugiej =
.
Jednak uwaga API stwierdza:
Ta metoda istnieje do użycia jako predykat, filtr (Objects :: isNull)
Czy istnieje jakikolwiek powód / okoliczność, dla których warto korzystać z object == null
ponad Objects.isNull()
w if ?
Czy powinno Objects.isNull()
się ograniczyć wyłącznie do orzeczeń?
if(null == variable)
konsekwentnie…variable
jestBoolean
.Odpowiedzi:
Jeśli spojrzeć na kod źródłowy w
IsNull
metodzie/* Returns true if the provided reference is null otherwise returns false.*/ public static boolean isNull(Object obj) { return obj == null; }
To jest to samo. Nie ma różnicy. Więc możesz go bezpiecznie używać.
źródło
== null
w programieif
, ale isNull świetnie nadaje się do użycia w wyrażeniach lambda.Objects.isNull
jest przeznaczony do użycia z filtrowaniem lambda Java 8.O wiele łatwiej i jaśniej jest pisać:
niż pisać:
.stream().filter(x -> x == null).
if
Jednak w ramach oświadczenia oba będą działać. Użycie języka== null
jest prawdopodobnie łatwiejsze do odczytania, ale ostatecznie sprowadzi się do preferencji stylu.źródło
Spójrz na źródło:
public static boolean isNull(Object obj) { return obj == null; }
Aby sprawdzić
null
wartości, możesz użyć:Objects.isNull(myObject)
null == myObject // avoids assigning by typo
myObject == null // risk of typo
Fakt, że
Objects.isNull
jest przeznaczony dlaPredicate
s, nie przeszkadza w używaniu go jak powyżej.źródło
=
zamiast==
(nie można kompilować, chyba że jest toBoolean
opakowanie dopuszczające wartość null , bądź sprawiedliwy)Boolean
opakowań dopuszczających wartość null w Javie. Jest to rzeczywiście dość rzadkie (i daje kompilatorowi ostrzeżenia, gdy przypisanie donull
jest sprawdzane tak, jakby było warunkiem), ale nie jest niemożliwe.Tak, jednym z powodów jest prostota kodu. Wewnątrz, jeśli stwierdzenie
object == null
jest jasne i dobrze znane. Nie może to prowadzić do niewłaściwego zachowania, jeśli na przykład pojawi się literówka.Jeśli zostanie pominięty
if (object = null) {}
z, nie będzie się kompilował lub wygeneruje ostrzeżenie w przypadku obiektu! W rzeczywistości nie ma powodu, aby używać instrukcji over within if . Oto dwa warianty obok siebie:=
Boolean
Objects.isNull(object)
object == null
if (object == null) { } if (Objects.isNull(object)) { }
Można powiedzieć, że tak, ogranicza się to wyłącznie do orzeczeń, chociaż nie ma technicznych przeszkód w używaniu
Objects.isNull()
wszędzie.Z
public static boolean isNull(Object obj)
javadoc metody:Więc jeśli używasz metody jak nie orzecznika jesteś rzeczywiście przy bardziej złożonych i uciążliwych ekspresji w porównaniu do prostych
object == null
.Oto fragment, z którego można porównać korzyści
Objects.isNull(object)
List<String> list = Arrays.asList("a", "b", null, "c", null); // As ready-made predicate long countNullsWithPredicate = list.stream().filter(Objects::isNull).count(); // Lambda long countNullsWithLambda = list.stream().filter(object -> object == null).count(); // Reimplement the Objects::isNull predicate long countNullsWithAnonymous = list.stream().filter(new Predicate<Object>() { @Override public boolean test(Object obj) { return obj == null; } }).count();
źródło
Pod względem semantycznym nie ma różnicy, ale ze względu na czytelność wolę następujące rzeczy
whatever == null
:import static java.util.Objects.isNull; // Other stuff... if(isNull(whatever)) { }
źródło