JavaRush /Блоги Java /Random-TG /Кофе-брейк №161. Чӣ тавр коркарди Null дар Java бо истифо...

Кофе-брейк №161. Чӣ тавр коркарди Null дар Java бо истифода аз ихтиёрӣ

Дар гурӯҳ нашр шудааст
Сарчашма: Миёна Ин мақола ба шумо барои беҳтар фаҳмидани ҳадафи Опсия ҳангоми кор бо рамзи Java кӯмак мекунад. Кофе-брейк №161.  Чӣ тавр коркарди Null дар Java бо истифода аз ихтиёрӣ - 1Вақте ки ман бори аввал кор бо рамзи Java оғоз кардам, ба ман аксар вақт маслиҳат медоданд, ки Опсияро истифода барам. Аммо он вақт ман каме дарк мекардам, ки чаро истифодаи Опсия беҳтар аз татбиқи коркард барои арзишҳои нул аст. Дар ин мақола, ман мехоҳам бо шумо нақл кунам, ки чаро мо бояд ҳама бояд Опсияро бештар истифода барем ва чӣ гуна аз изофанависии codeи худ, ки ба сифати code зараровар аст, пешгирӣ кунем.

Ихтиёрӣ чист?

Параметри ихтиёрӣ барои интиқоли an objectҳо ва имкон додани истинодҳои нул барои коркарди API-ҳои гуногун истифода мешавад. Биёед ба пораи code назар андозем:
Coffee coffee = new Coffee();
Integer quantity = coffee.getSugar().getQuantity();
Мо як мисоли қаҳва дорем , ки дар он мо аз як мисоли ашёи шакар каме шакар мегирем . Агар мо фарз кунем, ки арзиши миқдор ҳеҷ гоҳ дар созандаи қаҳва муқаррар нашудааст , пас coffee.getSugar().getQuantity() NullPointerException -ро бармегардонад . Албатта, мо ҳамеша метавонем чекҳои хуби кӯҳнаро барои ислоҳи мушкилот истифода барем .
Coffee coffee = new Coffee();
Integer quantity = 0;
if (coffee.getSugar() != null) {
  quantity = coffee.getSugar().getQuantity();
}
Ҳоло ҳама чиз хуб ба назар мерасад. Аммо ҳангоми навиштани codeи Java, мо беҳтар мебуд, ки аз татбиқи чекҳои null худдорӣ кунем . Биёед бубинем, ки ин корро бо истифода аз Опсия чӣ гуна кардан мумкин аст.

Чӣ тавр эҷоди ихтиёрӣ

Се роҳи эҷоди an objectҳои ихтиёрӣ вуҷуд дорад:
  • of(T value) — эҷоди an objectи ихтиёрии ғайри нул. Огоҳ бошед, ки истифодаи () барои истинод ба an objectи сифр NullPointerException -ро мепартояд .

  • ofNullable(T value) - арзиши ихтиёриро барои 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() -ро истифода баред , шумо имкониятро аз даст медиҳед! Барои фаҳмидани ин, биёед ҳоло мисоли болоро бо Опсия аз нав нависед.

Такмor санҷиши нул бо ихтиёрӣ

Пас, чӣ гуна мо метавонем рамзи дар боло зикршударо такмил диҳем? Бо ихтиёрӣ мо метавонем мавҷудияти an objectро бо истифода аз isPresent() фаҳмем ва онро бо истифода аз 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() ба Опсия ба назар чунин менамояд, ки ягон арзише илова намекунад, балки мушкorро зиёд мекунад. Мо метавонем натиҷаро бо истифода аз он чизе, ки ман вазифаҳои дӯстдоштаи ман аз синфи ихтиёрӣ мешуморам, беҳтар кунем:
  • харита(Function<? super T,? extensions U> mapper) - Арзиши дар ихтиёрӣ мавҷудбударо ба функсияи пешниҳодшуда харита мекунад. Агар параметри Опсия холӣ бошад, map() Optional.empty() -ро бармегардонад .

  • orElse(T other) versionи “махсус”-и усули 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-ро барои коркарди an objectҳои нул таъмин мекунад
  • ба муносибати декларативй имкон медихад, ки он чизеро, ки ба даст оварда мешавад, ифода намояд

Чӣ тавр бо Опсия самаранок шудан мумкин аст

Дар кори ман, ман Опсияро ҳамчун навъи бозгашт истифода мебарам, вақте ки усул метавонад ҳолати "натиҷа" -ро баргардонад. Ман одатан онро ҳангоми муайян кардани намудҳои бозгашт барои усулҳо истифода мебарам.
Optional<Coffee> findByName(String name) {
   ...
}
Баъзан ин лозим нест. Масалан, агар ман усуле дошта бошам, ки int -ро бар мегардонад , ба монанди getQuantity() дар синфи Sugar , пас усул метавонад 0- ро баргардонад , агар натиҷа барои ифодаи "миқдор нест" нул бошад . Акнун, бо донистани ин, мо метавонем фикр кунем, ки параметри шакар дар синфи қаҳва метавонад ҳамчун ихтиёрӣ муаррифӣ карда шавад. Дар назари аввал, ин як идеяи хуб ба назар мерасад, зеро дар назария, шакар дар қаҳва мавҷуд нест. Аммо, дар ин ҷо ман мехоҳам муроҷиат кунам, ки ҳангоми истифода набурдани Опсия. Мо бояд аз истифодаи Опсия дар сенарияҳои зерин худдорӣ кунем:
  • Ҳамчун намудҳои параметрҳо барои POJOs , ба монанди DTOs . Опсияҳо сериализатсия намешаванд, аз ин рӯ истифодаи онҳо дар POJO an objectро ғайриимкон месозад.

  • Ҳамчун далели методӣ. Агар аргументи метод null бошад , пас аз нуқтаи назари codeи холис, интиқоли null ба ҳар ҳол афзалтар аз гузариши ихтиёрӣ аст. Илова бар ин, шумо метавонед усулҳои изофабор эҷод кунед, то ба таври абстрактӣ набудани далели усули нулро идора кунед.

  • Барои муаррифии an objectи Коллексия, ки гум шудааст. Коллексияҳо метавонанд холӣ бошанд, аз ин рӯ Коллексияи холӣ, ба монанди маҷмӯи холӣ ё Рӯйхат , бояд барои муаррифии Коллексия бидуни арзиш истифода шавад.

Хулоса

Опсия иловаи пурқувват ба китобхонаи Java гардид. Он роҳи коркарди an objectҳоеро фароҳам меорад, ки вуҷуд надоранд. Аз ин ру, хангоми кор карда баромадани усулхо ба доми суиистеъмол наафтидан онро ба назар гирифтан лозим аст. Бале, шумо метавонед рамзи олие нависед, ки чекҳои бефоида ва коркарди нулро амалӣ мекунад, аммо ҷомеаи Java истифодаи Опсияро афзалтар медонад. Он ба таври муассир муошират мекунад, ки чӣ гуна арзишҳои гумшударо идора кардан мумкин аст, хондан нисбат ба чекҳои бесарусомони Null хеле осонтар аст ва дар муддати тӯлонӣ хатогиҳои codeи шумо камтар мешавад.
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION