JavaRush /Java блогы /Random-KK /Кофе-брейк №161. Қосымшаны пайдалану арқылы Java-да нөлді...

Кофе-брейк №161. Қосымшаны пайдалану арқылы Java-да нөлді қалай өңдеуге болады

Топта жарияланған
Дереккөз: Орташа Бұл мақала Java codeымен жұмыс істеу кезінде Қосымшаның мақсатын жақсырақ түсінуге көмектеседі. Кофе-брейк №161.  Қосымшаны пайдалану арқылы Java-да нөлді қалай өңдеуге болады - 1Мен Java codeымен алғаш жұмыс істей бастағанда, маған жиі Қосымшаны пайдалану ұсынылды. Бірақ сол кезде мен неліктен нөлдік мәндер үшін өңдеуді жүзеге асырудан гөрі Қосымшаны пайдалану жақсырақ екенін түсінбедім. Бұл мақалада мен сіздермен неге біз бәріміз Қосымшаны көбірек пайдалануымыз керек деп ойлаймын және code сапасына нұқсан келтіретін codeты артық таңдаудан қалай аулақ болуға болатынын бөліскім келеді.

Қосымша деген не?

Қосымша параметр нысандарды тасымалдау және әртүрлі 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 тудыратынын ескеріңіз .

Қосымшамен жұмыс істегенде get() және isPresent() функцияларын ғана пайдалансаңыз , бұл мүмкіндікті жіберіп алғаныңызды ескеріңіз! Мұны түсіну үшін жоғарыдағы мысалды Қосымша параметрімен қайта жазайық.

Қосымша көмегімен нөлдік тексеруді жақсарту

Сонымен, жоғарыдағы 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() әдісіне берілген мәнді қайтарады .

Әдіс Қосымша данада қамтылған мәнді қайтарады. Бірақ егер Қосымша параметр бос болса, онда ешқандай мән жоқ болса, 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 нысанын көрсету үшін. Жинақтар бос болуы мүмкін, сондықтан бос Жинақ немесе Тізім сияқты бос Жинақ мәндері жоқ Жинақты көрсету үшін пайдаланылуы керек.

Қорытынды

Қосымша Java кітапханасына қуатты қосымша болды. Ол жоқ болуы мүмкін нысандарды өңдеу жолын қамтамасыз етеді. Сондықтан қиянаттың торына түспей, әдіс-тәсілдерді жасағанда ескеру керек. Иә, сіз нөлдік тексерулерді және нөлдік өңдеуді жүзеге асыратын тамаша codeты жаза аласыз, бірақ Java қауымдастығы Қосымшаны пайдалануды жөн көреді. Ол жетіспейтін мәндерді қалай өңдеу керектігін тиімді түрде хабардар етеді, нөлдік тексерулерге қарағанда оқу оңайырақ және ұзақ мерзімді перспективада codeыңыздағы қателердің аз болуына әкеледі.
Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION