
Дізнайтесь більше про нові кар'єрні можливості в EchoUA. Цікаві проекти, ринкова оплата, гарний колектив. Надсилайте резюме та приєднуйтеся до нас.
Коли я розпочав програмувати на Java, Null дуже швидко став моїм головним ворогом. Зараз я можу з упевненістю сказати, що битва між мною і Null з успіхом завершилася. Більшість NullPointerExceptions трапляються з необережності, і, щоб допомогти Вам навчитися розбиратися з ними, я підготував невеликий список того, що я зазвичай роблю, коли зустрічаюся з Null.
Не ускладнюйте
Впоратися з Null буває іноді непросто, тому ми повинні писати код настільки чисто і зрозуміло, наскільки це можливо. Наприклад, використання методів Objects
, класу Optional
або навіть окремого методу, що використовує Optional
, замість простої перевірки на Null насправді виявляється дуже поганим рішенням.
if (Optional.ofNullable (myVariable).isPresent()) // погано
if (Objects.nonNull (myVariable)) // краще, але все одно погано if (myVariable != null) // добре
Використайте методи Objects як предикати Stream
Хоча використання Objects.isNull
і Objects.nonNull
не дуже добре підходить для звичайної перевірки на Null, проте вони чудово підійдуть для використання в потоках.
myStream.filter (Objects::nonNull)myStream.anyMatch(Objects::isNull)
Ніколи не передавайте Null як аргумент
І ось чому:
- Треба розбиратися, чи зможе наша функція і наступні після неї функції впоратися зі значенням Null.
- При зміні таких функцій треба бути дуже акуратним, адже, якщо щось піде не так, нам доведеться “перекопати” весь код у спробі знайти помилку.
Цих проблем можна уникнути, якщо ніколи не використати Null як аргумент функції.
void kill (){ kill (self);}void kill (Person person) { person.setDeathTime (now());}
Перевіряйте аргументи публічних API
Звичайно, Ви і Ваша команда можете дотримуватися принципу – “ніколи не використовувати Null як аргумент функції”, але якщо у Вас є свій публічний API, і його користувачі навіть не чули про такий принцип? Тому краще завжди перевіряти на коректність аргументи, що передаються у Ваший API.
public Foo (Bar bar, Baz baz) { this.bar = Objects.requireNonNull (bar, "bar must not be null"); this.baz = Objects.requireNonNull (baz, "baz must not be null");}
Ефективно використовуйте Optional
До Java 8 частою практикою було те, що метод повертав Null, якщо значення було відсутнє. Тепер у нас є клас Optional
, який попереджає Вас, що повернене значення може бути упущене.
Optional makingYouCheck (){ // stuff}makingYouCheck ().orElseThrow (ScrewYouException::new);
Повертайте порожні колекції замість Null
Ми вже знаємо, що повертати Null – погано і, що уникнути цього нам допоможе клас Optional
. Проте речі міняються, коли справа доходить до колекцій, адже колекції можуть містити будь-яку кількість елементів, у тому числі й 0. Тим більше в Collections
є спеціальні методи emptyXxx
, які можуть повертати такі колекції. Тому краще використати колекції, ніж ускладнювати речі Optional
чи повертати Null.
List findSomething (){ if (someCondition) { return Collections.emptyList (); } // stuff}
Optional не підходить для полів
Згідно з правилами інкапсуляції Ви повинні мати повний контроль над значеннями полів, включаючи Null. Якщо ми зробимо так, що поля можуть і не мати значень? Тоді це приведе до декількох проблем:
- Як писати конструктор або сетер для такого поля?
- Нам доведеться мати справу
Optional
, навіть, якщо ми впевнені, що значення є. - Як AutoMapper ‘и справлятимуться з такими полями?
Висновок: не використовуйте Optional
з полями.
Використовуйте винятки замість Null
Якщо щось пішло не так: завжди використовуйте винятки, замість того, щоб повертати Null.
Тестуйте свій код
Тестування – дієвий спосіб виявити NPE і виправити їх. Ніколи не варто випускати проект, заздалегідь не протестувавши його.
Подвійна перевірка
Щоразу, коли Ви припускаєте, що якийсь вираз не може виявитися Null – двічі перевірте Ваші висновки. Використайте документацію до API, запитайте колег, поставте запитання на Stack Overflow. І завжди пам’ятайте, що краще перестрахуватися, ніж потім розбиратися з Null.
Переклад статті “10 Tips To Handle Null Effectively”
Київ, Харків, Одеса, Дніпро, Запоріжжя, Кривий Ріг, Вінниця, Херсон, Черкаси, Житомир, Хмельницький, Чернівці, Рівне, Івано-Франківськ, Кременчук, Тернопіль, Луцьк, Ужгород, Кам'янець-Подільський, Стрий - за статистикою саме з цих міст програмісти найбільше переїжджають працювати до Львова. А Ви розглядаєте relocate?