17. Дар бораи истифодаи муваффақ ва номуваффақи Опсия мисолҳо оред
Фарз мекунем, ки мо як қатор арзишҳо дорем, ки тавассути онҳо мо тавассути ҷараён мегузарем ва дар ниҳоят мо баъзе ихтиёрӣ мегирем :Optional<String> stringOptional = Stream.of("a", "ab", "abc", "abcd")
.filter(str -> str.length() >= 3)
.findAny();
Мо, тавре ки интизор мерафтем, бояд аз ин Опсия арзиш гирем . Танҳо истифодаи get() роҳи бад аст:
String result = stringOptional.get();
Аммо ин усул бояд арзишро аз Опсия гирифта , ба мо баргардонад? Ин, албатта, дуруст аст, аммо агар маъно дошта бошад. Хуб, агар арзишҳо дар ҷараён гуногун бошанд ва дар ниҳоят мо як ихтиёрии холӣ гирифтем, вақте ки мо кӯшиш мекунем аз он бо усули get() арзиш гирем , инҳо партофта мешаванд: Ин хуб нест. Дар ин ҳолат, беҳтар аст, ки конструксияҳои зеринро истифода баред:
-
String result = null; if (stringOptional.isPresent()) { stringOptional.get(); }
Дар ин ҳолат, мо тафтиш мекунем, ки оё элемент дар Опсия аст . Дар акси ҳол, сатри натиҷавӣ арзиши кӯҳнаи худро дорад.
-
String result = stringOptional.orElse("default value");
Дар ин ҳолат, мо баъзе арзиши пешфарзро муайян мекунем, ки он ба сатри натиҷавӣ дар ҳолати холӣ Опсия дода мешавад .
-
String result = stringOptional.orElseThrow(() -> new CustomException());
Дар ин ҳолат, мо худамон истисно мегузорем, вақте ки Опсия холӣ аст .
18. Оё усули асосиро ниҳоӣ эълон кардан мумкин аст?
Бале, албатта, ҳеҷ чиз ба мо халал намерасонад, ки усули main() -ро ҳамчун ниҳоӣ эълон кунем . Компилятор хато намекунад. Аммо бояд дар хотир дошт, ки ҳама гуна усул пас аз эълони ниҳоӣ ба усули охирин табдил меёбад - бекор карда намешавад. Ҳарчанд, кӣ асосиро аз нав муайян мекунад ???19. Оё имкон дорад, ки як баста/классро ду маротиба ворид кунед? Оқибатҳо чӣ гуна буда метавонанд?
Бале шумо метавонед. Оқибатҳо? Мо якчанд воридоти нолозим хоҳем дошт, ки Intelijj IDEA ҳамчун хокистарӣ нишон медиҳад, яъне. истифоданашуда.20. Кастинг чист? Кай мо метавонем ClassCastException гирем?
Кастинг, ё навъи casting , раванди табдил додани як намуди додаҳо ба намуди дигари додаҳо мебошад: дастӣ (кастинги номуайян) ё худкор (кастинги навъи ошкор). Табдилдиҳии худкор аз ҷониби компилятор ва табдилдиҳии дастӣ аз ҷониби таҳиякунанда иҷро карда мешавад. Навъи кастинг барои ибтидоӣ ва синфҳо то андозае фарқ мекунад, аз ин рӯ мо онҳоро алоҳида баррасӣ хоҳем кард. Намудҳои ибтидоӣ Намунаи рехтани автоматии навъҳои ибтидоӣ:int value = 17;
double convertedValue = value;
Тавре ки шумо мебинед, дар ин ҷо ба ғайр аз аломати = дигар ҳеҷ гуна амалҳои иловагӣ лозим нест. Намунаи рехтани дастии навъҳои ибтидоӣ:
double value = 17.89;
int convertedValue = (int)value;
Дар ин ҳолат, мо метавонем тарҳи дастиро мушоҳида кунем, ки он бо истифода аз (int) амалӣ карда мешавад , ки дар он қисми пас аз вергул хориҷ карда мешавад ва convertedValue арзиши - 17 хоҳад буд. Дар бораи рехтани намудҳои ибтидоӣ дар ин мақола бештар хонед . Хуб, акнун биёед ба an objectҳо гузарем. Намудҳои истинод Барои навъҳои истинод, резиши автоматӣ барои синфҳои насл ба синфҳои волидайн имконпазир аст. Инро полиморфизм низ меноманд . Фарз мекунем, ки мо синфи Lion дорем , ки аз синфи Cat мерос гирифтааст . Дар ин ҳолат, табдor автоматӣ чунин хоҳад буд:
Cat cat = new Lion();
Аммо бо кастинги возеҳ , ҳама чиз то андозае мураккабтар аст, зеро ягон функсия барои буридани зиёдатӣ вуҷуд надорад, ба монанди примитивҳо. Ва танҳо як табдor возеҳи формаро иҷро кунед:
Lion lion= (Lion)new Cat();
Шумо хато мегиред: Дарвоқеъ, шумо метавонед усулҳоеро ба синфи насли Lion илова кунед, ки аслан дар синфи Cat набуданд ва сипас кӯшиш кунед, ки онҳоро даъват кунед, зеро навъи an objectи шумо Lion мешавад . Бале, дар ин кор мантиқ нест. Аз ин рӯ, тангкунии намуд танҳо он вақт имконпазир аст, ки an objectи аслӣ аз навъи Lion бошад , вале баъдтар ба синфи волидайн дода шудааст:
Lion lion = new Lion();
Cat cat = lion;
Lion newLion = (Lion)cat;
Инчунин, барои эътимоднокии бештар, сохтори танг кардани an objectҳо бо истифодаи instanceOf construct тавсия дода мешавад :
if (cat instanceof Lion) {
newLion = (Lion)new Cat();
}
Маълумоти бештарро дар бораи навъҳои истинод дар ин мақола хонед .
21. Чаро чаҳорчӯбаҳои муосир асосан танҳо истисноҳои тафтишнашударо истифода мебаранд?
Ман фикр мекунам, ки ин ҳама аз он сабаб аст, ки коркарди истисноҳои тафтишшуда ҳоло ҳам рамзи спагетти аст, ки дар ҳама ҷо такрор мешавад, аммо дар ҳама ҳолатҳо воқеан лозим нест. Дар чунин ҳолатҳо, коркардро дар дохor чаҳорчӯба кардан осонтар аст, то бори дигар онро ба дӯши таҳиягарон нагузоранд. Бале, албатта, метавонад вазъияти изтирорӣ ба миён ояд, аммо ин истисноҳои тафтишнашавандаро метавон ба таври қулайтар, бидуни ташвиш бо коркард дар try-catch ва бидуни гузариши минбаъда тавассути усулҳо ҳал кард. Танҳо табдил додани истисно ба баъзе посухи HTTP дар exceptionHandler кифоя аст .22. Воридоти статикӣ чист?
Ҳангоми истифодаи маълумотҳои статикӣ (методҳо, тағирёбандаҳо) шумо наметавонед худи an objectро эҷод кунед, балки онро бо номи синф иҷро кунед, аммо ҳатто дар ин ҳолат ба мо истинод ба синф лозим аст. Бо он ҳама чиз оддӣ аст: он бо истифодаи воридоти муқаррарӣ илова карда мешавад. Аммо чӣ мешавад, агар мо бе навиштани номи синф усули статикиро истифода барем, гӯё он усули статикии синфи ҷорӣ бошад? Ин бо воридоти статикӣ имконпазир аст! Дар ин ҳолат, мо бояд воридоти статикӣ ва истиноди ин усулро нависед. Мисли ин, масалан, усули статикии синфи Math барои ҳисоб кардани арзиши косинус:import static java.lang.Math.cos;
Дар натиҷа, мо метавонем усулро бидуни муайян кардани номи синф истифода барем:
double result = cos(60);
Мо инчунин метавонем бо истифода аз воридоти статикӣ ҳама усулҳои статикии синфро якбора бор кунем:
import static java.lang.Math.*;
23. Муносибати байни усулҳои hashCode() ва equals() чист?
Мувофиқи Oracle , қоида ин аст: Агар ду an object баробар бошанд (яъне усули equals() true -ро бармегардонад ), онҳо бояд як рамзи хэш дошта бошанд. Дар айни замон, фаромӯш накунед, ки ду an objectи гуногун метавонанд як рамзи хэш дошта бошанд. Барои фаҳмидани он ки чаро equals() ва hashCode() ҳамеша дар ҷуфт бекор карда мешаванд, ҳолатҳои зеринро баррасӣ кунед:-
Ҳарду усул бекор карда шудаанд.
Дар ин ҳолат, ду an objectи мухталифи дорои як ҳолати дохилӣ баробар () - true ро бармегардонанд , дар ҳоле ки hashCode() ҳарду рақами якхеларо бармегардонанд.
Маълум мешавад, ки хама чиз хуб аст, зеро коида риоя карда мешавад.
-
Ҳарду усулҳо бекор карда намешаванд.
Дар ин ҳолат, ду an objectи гуногун бо ҳолати дохилӣ якхела ҳангоми баробар() бардурӯғ бармегарданд , зеро муқоиса бо истинод тавассути оператори == сурат мегирад .
Усули hashCode () инчунин арзишҳои гуногунро бармегардонад (эҳтимоли зиёд), зеро он арзиши табдилшудаи суроғаи ҷойгиршавии хотираро тавлид мекунад. Аммо барои як an object ин арзиш якхела хоҳад буд, ҳамон тавре ки equals() дар ин ҳолат танҳо вақте ҳақиқиро бармегардонад , ки истинодҳо ба ҳамон an object ишора мекунанд.
Маълум мешавад, ки дар ин ҳолат ҳама чиз хуб аст ва қоида иҷро мешавад.
-
Барқароршуда баробар() , нест, hashCode() бекор карда шудааст .
Дар ин ҳолат, барои ду an objectи гуногун бо ҳолати дохorи якхела, equals() true ро бармегардонад ва hashCode() арзишҳои гуногунро (эҳтимоли зиёд) бармегардонад.
Ин вайронкунии қоида аст, бинобар ин тавсия дода намешавад, ки ин корро анҷом диҳед.
-
equals() бекор карда нашудааст , hashCode() бекор карда шудааст .
Дар ин ҳолат, барои ду an objectи гуногун бо ҳолати дохorи якхела, equals() бардурӯғ ва hashCode() ҳамон арзишҳоро бармегардонад.
Вайрон кардани коида чой дорад, бинобар ин муносибат нодуруст аст.
24. Синфҳои BufferedInputStream ва BufferedOutputStream кай истифода мешаванд?
InputStream барои хондани byte ба byte маълумот аз баъзе манбаъ истифода мешавад ва OutputStream барои навиштани byte ба byte истифода мешавад. Аммо амалиёти byte-byte метавонад хеле нороҳат бошад ва коркарди иловагиро талаб кунад (барои хондан/навиштани матнҳои муқаррарӣ). Воқеан, барои содда кардани чунин сабтҳои byte, BufferedOutputStream ҷорӣ карда шуд ва BufferedInputStream барои хондан ҷорӣ карда шуд . Ин синфҳо ҷуз буферҳое нестанд, ки маълумотро ҷамъ мекунанд ва ба шумо имкон медиҳанд, ки бо додаҳо на byte ба byte, балки бо тамоми пакетҳои додаҳо (массивҳо) кор кунед. Ҳангоми эҷод, BufferedInputStream ба созандаи худ намунаи навъи InputStream -ро мегирад , ки аз он маълумот хонда мешавад:BufferedInputStream bufferedInputStream = new BufferedInputStream(System.in);
byte[] arr = new byte[100];
bufferedInputStream.read(arr);
System.in an objectи InputStream аст , ки маълумотро аз консол мехонад. Яъне, бо истифода аз ин an objectи BufferedInputStream , мо метавонем маълумотро аз InputStream бо навиштани он ба массиви гузашта хонем. Ин як навъ бастабандии синфи InputStream мегардад . Массиви arr аз ин мисол массивест, ки маълумотро аз BufferedInputStream мегирад . Ин, дар навбати худ, маълумотро аз InputStream бо массиви дигар мехонад, ки ба таври нобаёнӣ андозаи 2048 byte дорад. Айнан ҳамин чиз барои BufferedOutputStream дуруст аст : намунаи навъи OutputStream бояд ба созанда интиқол дода шавад , ки мо ба он маълумотро дар тамоми массивҳо менависем:
byte[] arr = "Hello world!!!".getBytes();
BufferedOutputStream bufferedInputStream = new BufferedOutputStream(System.out);
bufferedInputStream.write(arr);
bufferedInputStream.flush();
System.out як an objectи OutputStream аст , ки маълумотро ба консол менависад. Усули flush() маълумотро аз BufferedOutputStream ба OutputStream мефиристад ва BufferedOutputStream-ро дар раванд тоза мекунад . Бе ин усул чизе сабт карда намешавад. Ва шабеҳи мисоли қаблӣ: arr массивест, ки аз он маълумот ба BufferedOutputStream навишта мешавад . Аз он ҷо онҳо ба OutputStream дар массиви дигар навишта мешаванд , ки ба таври нобаёнӣ андозаи 512 byte дорад. Дар бораи ин ду синф дар мақола бештар хонед .
25. Фарқи байни синфҳои java.util.Collection ва java.util.Collections чист?
Коллексия интерфейсест, ки сардори иерархияи коллексия мебошад. Он синфҳоро муаррифӣ мекунад, ки ба шумо имкон медиҳанд, ки тамоми гурӯҳҳои an objectҳоро эҷод, дар бар гиранд ва тағир диҳед. Барои ин усулҳои зиёде мавҷуданд, ба монанди add() , remove() , contain() ва ғайра. Интерфейсҳои асосии синфи Коллексия :-
Маҷмӯа интерфейсест, ки маҷмӯаро тавсиф мекунад, ки дорои унсурҳои беҳамто (такрорнашаванда) мебошад.
-
Рӯйхат интерфейсест, ки сохтори маълумотро тавсиф мекунад, ки пайдарпаии фармоишии an objectҳоро нигоҳ медорад. Ин an objectҳо индекси (рақами) худро мегиранд, ки бо истифода аз он шумо метавонед бо онҳо муошират кунед: гирифтан, нест кардан, тағир додан, аз нав навиштан.
-
Навбат интерфейсест, ки сохтори маълумотро бо нигоҳ доштани унсурҳо дар шакли навбат тавсиф мекунад, ки аз рӯи қоида - FIFO - First In First Out -ро риоя мекунад .
-
addAll(Collection<? super T> коллексия, T...element) - унсурҳои гузаштаи навъи T- ро ба коллексия илова мекунад .
-
нусхабардорӣ(List<? super T> dest, List<? extends T> src) - ҳамаи унсурҳоро аз рӯйхат src ба рӯйхат дар dest нусхабардорӣ мекунад .
-
emptyList () - рӯйхати холӣ бар мегардонад.
-
max(Collection<? extensions T> collection, Comparator<? super T> comp) - Унсури максималии коллексияи додашударо мувофиқи тартиби муайянкардаи муқоисакунандаи мушаххас бармегардонад.
-
unmodifiableList(Рӯйхат<? рӯйхати T>-ро васеъ мекунад) - намоиши тағирнашавандаи рӯйхати гузаштаро бармегардонад.
GO TO FULL VERSION