Ответ 1
Метод 4 самый лучший.
if(foo != null && foo.bar()) {
someStuff();
}
будет использовать оценку короткого замыкания, то есть оно заканчивается, если первое условие logical AND
ложно.
Перед вызовом функции объекта мне нужно проверить, является ли объект нулевым, чтобы не выбрасывать NullPointerException
.
Каков наилучший способ сделать это? Я рассмотрел эти методы.
Какая из них является лучшей практикой программирования для Java?
// Method 1
if (foo != null) {
if (foo.bar()) {
etc...
}
}
// Method 2
if (foo != null ? foo.bar() : false) {
etc...
}
// Method 3
try {
if (foo.bar()) {
etc...
}
} catch (NullPointerException e) {
}
// Method 4 -- Would this work, or would it still call foo.bar()?
if (foo != null && foo.bar()) {
etc...
}
Метод 4 самый лучший.
if(foo != null && foo.bar()) {
someStuff();
}
будет использовать оценку короткого замыкания, то есть оно заканчивается, если первое условие logical AND
ложно.
Последний и лучший. я ЛОГИЧЕСКИЙ И
if (foo != null && foo.bar()) {
etc...
}
Потому что в логическом &&
нет необходимости знать, что такое правая сторона, результат должен быть ложным
Предпочитает читать: Короткое замыкание логического оператора Java
В Java 8 лучший способ проверить значение null:
Objects.isNull(obj) //returns true if the object is null
Objects.nonNull(obj) //returns true if object is not-null
if(Objects.nonNull(foo) && foo.something()) // Uses short-circuit as well. No Null-pointer Exceptions are thrown.
Помимо этого... Вы также можете использовать дополнительный класс Guava
Уменьшает типологические ошибки, такие как (obj=null)
, который всегда возвращает true
, как обсуждалось в предыдущих ответах.
NullPointerException
. Это плохая практика. Лучше убедиться, что значение не равно null.Метод 4 является лучшим и лучшим, поскольку он четко указывает, что произойдет, и использует минимальный код.
Метод 3 просто неверен на каждом уровне. Вы знаете, что элемент может быть нулевым, поэтому не исключительная ситуация - это то, что вы должны проверить.
Метод 2 просто усложняет его выполнение.
Метод 1 - это просто метод 4 с дополнительной строкой кода.
Я бы сказал, что метод 4 является самой общей идиомой из кода, на который я смотрел. Но это всегда кажется мне вонючим. Предполагается, что foo == null совпадает с foo.bar() == false.
Это не всегда мне нравится.
Метод 4 - мой предпочтительный метод. Короткое замыкание && оператор делает код наиболее читаемым. Метод 3, Catching NullPointerException, нахмурился большую часть времени, когда достаточно простой проверки нуля.
В Java 7 вы можете использовать Objects.requireNonNull()
.
Добавьте импорт класса Objects
из java.util
.
public class FooClass {
//...
public void acceptFoo(Foo obj) {
//If obj is null, NPE is thrown
Objects.requireNonNull(obj).bar(); //or better requireNonNull(obj, "obj is null");
}
//...
}
Если вы управляете вызываемым API, рассмотрите возможность использования Guava Необязательный класс
Подробнее здесь. Измените свой метод, чтобы вернуть Optional<Boolean>
вместо Boolean
.
Это сообщает вызывающему коду, что он должен учитывать возможность null, вызывая один из удобных методов в Optional
Как говорили другие, # 4 - лучший метод, когда не используется библиотечный метод. Однако вы всегда должны ставить нуль в левой части сравнения, чтобы убедиться, что вы случайно не назначили null для foo в случае опечатки. В этом случае компилятор поймает ошибку.
// You meant to do this
if(foo != null){
// But you made a typo like this which will always evaluate to true
if(foo = null)
// Do the comparison in this way
if(null != foo)
// So if you make the mistake in this way the compiler will catch it
if(null = foo){
// obviously the typo is less obvious when doing an equality comparison but it a good habit either way
if(foo == null){
if(foo = null){
Вы также можете использовать StringUtils.isNoneEmpty("")
для проверки null или empty.
Если вы вообще проверите с двойным равным "==", тогда установите флажок null с объектом ref, например
if(null == obj)
вместо
if(obj == null)
потому что если вы ошибочно принимаете одиночное значение if (obj = null), оно вернет true (присвоение объекта возвращает успех (который является "истинным" в значении).
если у вас нет доступа к общедоступной библиотеке apache, возможно, будет работать нормально
if(null != foo && foo.bar()) {
//do something
}
Ваше последнее предложение - лучшее.
if (foo != null && foo.bar()) {
etc...
}
Потому что:
Мы можем использовать статический метод Object.requireNonNull класса Object. Реализация ниже
public void someMethod(SomeClass obj) {
Objects.requireNonNull(obj, "Validation error, obj cannot be null");
}
Простая одна строка Код для проверки null:
namVar == null ? codTdoForNul() : codTdoForFul();