Кошумча деген эмне?
Кошумча параметр 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 алып келерин эске алыңыз .
Кошумча менен нөлдүк текшерүүнү жакшыртуу
Ошентип, жогорудагы 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() ыкмасына берилген маанини кайтарат .
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исин көрсөтүү үчүн. Коллекциялар бош болушу мүмкүн, андыктан бош Топтом же Тизме сыяктуу бош Коллекция маанилери жок Коллекцияны көрсөтүү үчүн колдонулушу керек .
GO TO FULL VERSION