Қосымша деген не?
Қосымша параметр нысандарды тасымалдау және әртүрлі API интерфейстерімен өңделетін нөлдік сілтемелерді қосу үшін пайдаланылады . Код үзіндісін қарастырайық:Coffee coffee = new Coffee();
Integer quantity = coffee.getSugar().getQuantity();
Бізде Coffee данасы бар, онда біз Қант нысанының данасынан қанттың біраз мөлшерін аламыз . Егер сан мәні Coffee конструкторында ешқашан орнатылмаған деп есептесек , coffee.getSugar().getQuantity() NullPointerException мәнін қайтарады . Әрине, мәселені шешу үшін әрқашан жақсы ескі нөлдік тексерулерді пайдалана аламыз.
Coffee coffee = new Coffee();
Integer quantity = 0;
if (coffee.getSugar() != null) {
quantity = coffee.getSugar().getQuantity();
}
Қазір бәрі жақсы сияқты. Бірақ Java codeын жазғанда біз null тексерулерін енгізуден аулақ боламыз . Мұны Қосымша арқылы қалай жасауға болатынын көрейік.
Қосымшаны қалай жасауға болады
Қосымша нысандарды құрудың үш жолы бар:-
of(T мәні) — Қосымша бос емес нысанның данасы. Нөлдік нысанға сілтеме жасау үшін of() пайдалану NullPointerException шығаратынын ескеріңіз .
-
ofNullable(T мәні) - нөл болуы мүмкін нысан үшін Қосымша мән жасайды.
-
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();
Сонымен, сізде Қосымша нысан бар. Енді Қосымша үшін екі негізгі әдісті қарастырайық:
-
isPresent() - Бұл әдіс Қосымша нысанда бос емес мән бар-жоғын айтады.
-
get() - Қосымша үшін мәнді ағымдағы мәнмен шығарады. Get() функциясын бос Қосымшада шақыру NullPointerException тудыратынын ескеріңіз .
Қосымша көмегімен нөлдік тексеруді жақсарту
Сонымен, жоғарыдағы codeты қалай жақсартуға болады? Қосымша параметрімен isPresent() көмегімен нысанның бар екенін түсінеміз және оны get() арқылы шығарып аламыз . кофе.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() әдісінің “арнайы” нұсқасы . Ол Қосымшада қамтылған мәнді ала алады. Дегенмен, бос Қосымша болған жағдайда, бұл orElse() әдісіне берілген мәнді қайтарады .
Coffee coffee = new Coffee();
Integer quantity = Optional.ofNullable(coffee.getSugar())
.map(it -> it.getQuantity())
.orElse(0);
Бұл өте керемет - кем дегенде мен солай ойлаймын. Енді, егер бос мән болған жағдайда әдепкі мәнді қайтарғымыз келмесе, онда қандай да бір ерекшелік түрін шығару керек. orElseThrow(Жабдықтаушы<? X> exceptionSupplier кеңейтеді) Қосымша параметрлерде қамтылған мәнді қайтарады немесе Қосымша бос болса, ерекше жағдайды шығарады.
Coffee coffee = new Coffee();
Integer quantity = Optional.ofNullable(coffee.getSugar())
.map(it -> it.getQuantity())
.orElseThrow(IllegalArgumentException::new);
Көріп отырғаныңыздай, Қосымша бірнеше артықшылықтар береді:
- нөлдік тексерулерді абстракциялайды
- нөлдік нысандарды өңдеуге арналған API ұсынады
- декларативті тәсілге қол жеткізген нәрсені білдіруге мүмкіндік береді
Қосымшамен қалай тиімді болуға болады
Менің жұмысымда әдіс «нәтиже жоқ» күйін қайтара алатын кезде қайтару түрі ретінде Қосымшаны қолданамын. Мен оны әдетте әдістер үшін қайтару түрлерін анықтау кезінде қолданамын.Optional<Coffee> findByName(String name) {
...
}
Кейде бұл қажет емес. Мысалы, егер менде Sugar сыныбында getQuantity() сияқты int мәнін қайтаратын әдіс болса, «сан жоқ» деген нәтиже нөл болса , әдіс 0 мәнін қайтаруы мүмкін. Енді, мұны біле отырып, Coffee класындағы Қант параметрін Қосымша ретінде көрсетуге болады деп ойлауға болады . Бір қарағанда, бұл жақсы идея сияқты көрінеді, өйткені теорияда қанттың кофеде болуы міндетті емес. Дегенмен, мен осы жерде Қосымшаны пайдаланбау керектігін айтқым келеді . Келесі сценарийлерде Қосымшаны пайдаланудан аулақ болуымыз керек:
-
DTO сияқты POJO үшін параметр түрлері ретінде . Қосымшаларды сериялау мүмкін емес, сондықтан оларды POJO ішінде пайдалану нысанның сериялану мүмкіндігін ажыратады.
-
Әдіс аргументі ретінде. Егер әдіс аргументі null болуы мүмкін болса , онда таза code тұрғысынан алғанда, null мәнін беру Қосымша параметрін беруден гөрі жақсырақ болады. Бұған қоса, бос әдіс аргументінің жоқтығын дерексіз өңдеу үшін шамадан тыс жүктелген әдістерді жасауға болады.
-
Жоқ Collection нысанын көрсету үшін. Жинақтар бос болуы мүмкін, сондықтан бос Жинақ немесе Тізім сияқты бос Жинақ мәндері жоқ Жинақты көрсету үшін пайдаланылуы керек.
GO TO FULL VERSION