JavaRush /Java блогу /Random-KY /Кофе-брейк №161. Кошумча колдонуу менен Java'да Null мене...

Кофе-брейк №161. Кошумча колдонуу менен Java'да Null менен кантип иштөө керек

Группада жарыяланган
Булак: Орто Бул макала сизге Java codeу менен иштөөдө Кошумча максатын жакшыраак түшүнүүгө жардам берет. Кофе-брейк №161.  Кошумча колдонуу менен Java'да Null менен кантип иштөө керек - 1Мен Java codeу менен биринчи жолу иштей баштаганда, мага көбүнчө Кошумчаны колдонуу сунушталат. Бирок ал кезде мен эмне үчүн нөлдүк маанилерди иштетүүгө караганда Опцияны колдонуу жакшыраак экенин түшүнгөн эмесмин. Бул макалада мен эмне үчүн биз бардыгыбыз Опцияны көбүрөөк колдонушубуз керек деп ойлойм жана codeуңуздун сапатына зыян келтирүүчү codeуңузду ашыкча оптималдаштыруудан кантип сактануу керектигин сиз менен бөлүшкүм келет.

Кошумча деген эмне?

Кошумча параметр an objectтерди алып жүрүү жана нөлдүк шилтемелерди ар кандай API'лер менен иштетүү үчүн колдонулат . Келгиле, code үзүндүсүн карап көрөлү:
Coffee coffee = new Coffee();
Integer quantity = coffee.getSugar().getQuantity();
Бизде Coffee үлгүсү бар, анда биз Шекер an objectинин бир мисалынан кантты алабыз . Эгерде биз сандык маани эч качан Coffee конструкторунда коюлган эмес деп ойлосок , анда coffee.getSugar().getQuantity() NullPointerException кайтарат . Албетте, көйгөйдү чечүү үчүн биз ар дайым жакшы эски нөл чектерди колдоно алабыз.
Coffee coffee = new Coffee();
Integer quantity = 0;
if (coffee.getSugar() != null) {
  quantity = coffee.getSugar().getQuantity();
}
Азыр баары жакшы окшойт. Бирок Java codeун жазып жатканда, биз null текшерүүлөрдү ишке ашыруудан качканыбыз оң . Келгиле, муну Кошумча колдонуу менен кантип жасоого болорун карап көрөлү.

Опцияны кантип түзүү керек

Кошумча an objectтерди түзүүнүн үч жолу бар:
  • of(T мааниси) — Кошумча нөл эмес an objectтин инстанциясы. Нөл an objectке кайрылуу үчүн of() колдонуу NullPointerException ыргыта турганын эске алыңыз .

  • ofNullable(T мааниси) - нөл болушу мүмкүн болгон an object үчүн Кошумча маанини түзөт.

  • empty() - null шилтемесин билдирген Кошумча инстанцияны түзөт .

// пример использования Optional.of(T Value)
String name = "foo";
Optional<String> stringExample = Optional.of(name)
// пример использования Optional.ofNullable(T Value)
Integer age = null;
Optional<Integer> integerExample= Optional.ofNullable(age)
// пример использования Optional.empty()
Optional<Object> emptyExample = Optional.empty();
Ошентип, сизде Кошумча an object бар. Эми кошумча үчүн эки негизги ыкмаларды карап көрөлү:
  • isPresent() - Бул ыкма Кошумча an object нөл эмес маанини камтыган же камтыбаганын айтып берет.

  • get() - Кошумча маанисин учурдагы маани менен чыгарат. Get() функциясын бош Опцияга чакыруу NullPointerException алып келерин эске алыңыз .

Кошумча менен иштөөдө get() жана isPresent() гана колдонсоңуз , анда сиз бул мүмкүнчүлүктү өткөрүп жибересиз! Муну түшүнүү үчүн, келгиле, жогорудагы мисалды кошумча менен кайра жазалы.

Кошумча менен нөлдүк текшерүүнү жакшыртуу

Ошентип, жогорудагы codeду кантип жакшыртсак болот? Кошумча менен биз isPresent() аркылуу an objectтин бар экенин түшүнө алабыз жана get() аркылуу аны чыгара алабыз . Келгиле, coffee.getSugar() натыйжасын Кошумча жана isPresent() ыкмасы менен таңгактоодон баштайлы . Бул бизге getSugar() нөлдү кайтарып бербестигин аныктоого жардам берет .
Coffee coffee = new Coffee();
Optional<String> sugar = Optional.ofNullable(coffee.getSugar());
int quantity = 0;
if (sugar.isPresent()) {
  Sugar sugar = sugar.get();
  int quantity = sugar.getQuantity();
}
Бул мисалды карасак, coffee.getSugar() натыйжасын Кошумчага таңгактоо эч кандай мааниге ээ эмес, тескерисинче, түйшүк жаратат. Кошумча класстагы менин сүйүктүү функцияларымды колдонуу менен натыйжаны жакшыртсак болот:
  • map(Function<? super T,? extensions U> mapper) - Кошумча камтылган маанини берилген функцияга карталайт. Кошумча параметр бош болсо, map() Optional.empty() кайтарат .

  • orElse(T other) get() методунун “өзгөчө” versionсы . Ал кошумча камтылган маанини ала алат. Бирок, бош Кошумча болгон учурда, бул orElse() ыкмасына берилген маанини кайтарат .

Метод Кошумча инстанцияда камтылган маанини кайтарат. Бирок Кошумча параметр бош болсо, анда анда orElse() демейки маани катары белгилүү болгон метод кол тамгасына берилген маанини кайтарат.
Coffee coffee = new Coffee();

Integer quantity = Optional.ofNullable(coffee.getSugar())
    .map(it -> it.getQuantity())
    .orElse(0);
Бул чындап эле сонун - жок дегенде мен ошондой деп ойлойм. Эми, эгер бош мааниде биз демейки маанини кайтаргыбыз келбесе, анда кандайдыр бир өзгөчөлүктү ташташыбыз керек. orElseThrow(Supplier<? extensions X> exceptionSupplier) Кошумча параметрлерде камтылган маанини кайтарат же Кошумча бош болсо, өзгөчөлүктү ыргытат.
Coffee coffee = new Coffee();

Integer quantity = Optional.ofNullable(coffee.getSugar())
  .map(it -> it.getQuantity())
  .orElseThrow(IllegalArgumentException::new);
Көрүнүп тургандай, кошумча бир нече артыкчылыктарды берет:
  • нөл чектердин абстракттары
  • нөл an objectтерди иштетүү үчүн API камсыз кылат
  • декларативдүү мамиле жасоого жетишилген нерсени билдирүүгө мүмкүндүк берет

Кошумча менен кантип натыйжалуу болууга болот

Менин ишимде, мен "натыйжа жок" абалын кайтара алганда, кайтаруу түрү катары мен кошумча колдоном. Мен көбүнчө методдор үчүн кайтаруу түрлөрүн аныктоодо колдоном.
Optional<Coffee> findByName(String name) {
   ...
}
Кээде бул зарыл эмес. Мисалы, эгер менде Sugar классында getQuantity() сыяктуу int кайтара турган метод болсо, анда "сан жок" деген жыйынтык нөл болсо, метод 0 кайтарышы мүмкүн. Эми муну бorп туруп, Coffee классындагы Шекер параметрин Кошумча катары көрсөтсө болот деп ойлосок болот . Бир караганда, бул жакшы идея сыяктуу сезилет, анткени теорияда канттын кофеде болушунун кереги жок. Бирок, бул жерде мен Кошумчаны колдонбоо керектиги жөнүндө айткым келет . Төмөнкү сценарийлерде кошумчаны колдонуудан качышыбыз керек:
  • POJO үчүн параметр түрлөрү катары , мисалы, DTOs . Кошумчаларды сериялаштыруу мүмкүн эмес, ошондуктан аларды POJOдо колдонуу an objectтин сериялаштыруу мүмкүнчүлүгүн өчүрөт.

  • Метод аргументи катары. Эгерде метод аргументи null болушу мүмкүн болсо , анда таза codeдун көз карашынан алганда, нөлгө өтүү дагы эле Кошумча эмес. Кошумчалай кетсек, нөл метод аргументинин жоктугун абстракттуу түрдө иштетүү үчүн ашыкча жүктөлгөн ыкмаларды түзө аласыз.

  • Жок болгон Collection an objectисин көрсөтүү үчүн. Коллекциялар бош болушу мүмкүн, андыктан бош Топтом же Тизме сыяктуу бош Коллекция маанилери жок Коллекцияны көрсөтүү үчүн колдонулушу керек .

Корутунду

Кошумча Java китепканасына күчтүү кошумча болуп калды. Ал жок болушу мүмкүн болгон an objectилерди башкаруунун жолун камсыз кылат. Ошондуктан кыянатчылыктын торуна түшпөй, ыкмаларды иштеп чыгууда аны эске алуу керек. Ооба, сиз нөлдүк текшерүүлөрдү жана нөлдүк иштетүүнү ишке ашырган сонун codeду жаза аласыз, бирок Java коомчулугу Кошумча колдонууну артык көрөт. Ал жетишпеген маанилерди кантип иштетүүнү натыйжалуу көрсөтөт, башаламан Null текшерүүлөрүнө караганда окуу оңой жана узак мөөнөттүү келечекте codeуңуздагы мүчүлүштүктөрдү азайтат.
Комментарийлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION