10 способів ефективно впоратися з Null в Java


Дізнайтесь більше про нові кар'єрні можливості в 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?


Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *