1. Оғозкунии дукарата
Оғозсозӣ бо истифода аз қавсҳои дукарата (
минбаъд ҳамчун ибтидосозии дукарата номида мешавад ) як воситаи Java барои эҷоди коллексияҳо ба монанди рӯйхат, маҷмӯа ва харита ҳамзамон бо эъломияи онҳо мебошад.
Вақте ки ба шумо рӯйхатҳо бо унсурҳои собит лозим аст, ба монанди рӯйхати маҳсулот ё асъори дастгирӣшаванда, эълон кардани рӯйхат ҳамзамон ҳангоми оғоз кардани он хониши codeро беҳтар мекунад. Ин аст, ки чаро инициализатсияи дукарата шӯҳрат пайдо мекунад, зеро дигар усулҳои стандартии эҷоди коллексияҳо бо оғозкунии ҳамзамон дар code вуҷуд надоранд. Мутаассифона, бар хилофи дигар забонҳои барномасозӣ, Java маҷмӯаҳои литералиро дастгирӣ намекунад. Аз сабаби ин маҳдудият, эҷоди unmodifiableList
бо ҳатто шумораи ками унсурҳо моро маҷбур мекунад, ки сатрҳои зиёди codeро дар шакли зангҳои такрорӣ нависем
add()
, то унсурҳои дилхоҳро бо печонидани ниҳоӣ илова кунем:
List<Integer> list = new ArrayList<>();
list.add(2);
list.add(3);
list.add(5);
list.add(7);
List<Integer> unmodifiableList = Collections.unmodifiableList(list);
Ин тавсифи нолозим аст, ки онро содда кардан мумкин аст. Биёед рӯйхатҳои статикиро ба тарзе, ки барои мо қулай аст, пур кунем, яъне бевосита дар блокҳои статикӣ ҳангоми оғозёбӣ, ки ин ба
Double brace
мо инициализатсия кӯмак мекунад ва ба мо имкон медиҳад ҳама чизро дар як сатр нависем:
List<Integer> list = Collections.unmodifiableList(new ArrayList<Integer>() {{
add(2);
add(3);
add(5);
}});
Ба ҳамин монанд,
Double brace
оғозёбӣ ба мо кӯмак мекунад, ки арзишҳоро пур кунем ва
HashMap
:
Map<Integer, String> intToString = new HashMap<Integer, String>(){{
put(1, "one");
put(2, "two");
put(3, "three");
}};
Ин ҳама хеле шево ба назар мерасад, аммо он камбудиҳои худро дорад, ки оғозкунии дукаратаро як намунаи зиддитеррористӣ месозад. Мо онҳоро дар боби оянда бештар дида мебароем.
Тарафҳои мусбат ва манфии оғозкунии дукарата.
Double
оғозкунии қавс эҷоди синфи
дохorи беномро истифода мебарад . Он чизе, ки дар аввал дар рӯи замин пинҳон аст,
Double brace
инициализатсия синфро бо оғозкунии минбаъдаи мисоли он ҳар вақте, ки шумо онро истифода мебаред, эҷод мекунад. Илова бар ин, истиноди пинҳонӣ ба ин синфи хусусӣ истифода мешавад, ки метавонад моро ба ихроҷи хотираи эҳтимолӣ расонад. Шумо инчунин наметавонед оператори арвоҳро барои генерикҳо истифода баред (оператори алмос < >), зеро мо наметавонем ба дохor синфи беном дастрасӣ пайдо кунем.
(Аз тарҷумон: Бори дигар муфассалтар:
пас аз якум { , синфи беном дар дохor эҷод мешавад, пас аз дуюм, { ҳангоми сохтани як мисоли синф, ки дар он мо ба майдонҳо ва усулҳои берунии ( нисбат ба беном) синф.) |
Тарафдор:
- Кам кардани сатрҳо дар code
- Эҷод ва оғозёбӣ дар як ифода.
Камбудиҳо:
- Эҷоди синфи беном аз шумо пинҳон.
- Ин барои мисоли он ҳар дафъае, ки мо онро истифода мебарем, ба мо хароҷоти иловагиро талаб мекунад.
- Ҳар дафъае, ки истинод ба он пинҳон карда мешавад, ки метавонад боиси ихроҷи хотира гардад.
Ҳукм: Аз сабаби манфиҳои дар боло зикршуда ва мавҷудияти алтернативаҳо ба Double brace, инициализатсия дар ҷаҳони Java як намунаи зиддитеррористӣ ҳисобида мешавад.
Алтернативаҳо барои оғозкунии дукарата дар Java
Хабари хуш ин аст, ки роҳҳои дигари расидан ба ҳамон ҳадафҳо дар Java вуҷуд доранд. Мо метавонем дар як сатри code сохтан ва оғоз кардани ArrayList-ро бо истифода аз конструктори Copy аз синфи Коллексия тавре ки дар зер нишон дода шудааст, амалӣ созем:
List<Integer> list = Collections.unmodifiableList(new ArrayList<>(Arrays.asList(2, 3, 5)));
Arrays.asList()
ба мо рӯйхати дарозии собитро, ки ба
ArrayList
созандаи нусхабардорӣ дода шудааст, бармегардонад. Фарқи байни рӯйхатҳои дарозии собит, ки аз
Arrays.asList()
ва баргардонида шудаанд, дар хотир нигоҳ доред
Collections.unmodifiableList()
: шумо наметавонед ҷузъҳои
ArrayList
- -ро илова кунед ё хориҷ кунед, аммо шумо метавонед як унсурро бо истифода аз индекс тағир диҳед
set()
, ки онро бо рӯйхати баргардонидашуда иҷро карда наметавонед
Collections.unmodifiableList()
. Агар шумо хоҳед, ки рӯйхати хурд гиред, ин роҳи беҳтарин аст, гарчанде ки он барои
Set
коллексияҳои дигар камтар шаффоф хоҳад буд, бинобар ин шумо бояд онро
List
пеш аз эҷод кардани
Set
-a эҷод кунед. Аммо ин ҳанӯз ҳам беҳтар аз ибтидосозии дукарата аст, зеро дар ин ҳолат синфи иловагии дохorи беном ҳар дафъа истифода мешавад, эҷод намешавад. Агар шумо Java 8-ро иҷро кунед, шумо усули дигари алтернативӣ доред. JDK 8 Stream API ба шумо тавассути омезиши
Stream Factory
усулҳои баромад дар коллексия коллексияҳои хурд эҷод мекунад
List
:
List<String> list = Collections.unmodifiableList(Stream.of("abc", "bcd", "cde").collect(toList()));
Барои
Set
шумо метавонед
Collectors.toSet()
ба ҷои ин усулро
Collectors.toList()
ба таври зерин истифода баред:
Set<String> set = Collections.unmodifiableSet(Stream.of("abc", "bcd", "cde").collect(toSet()));
Дар омади гап,
Stream collect
усулҳо кафолат намедиҳанд, ки коллексияҳои тавлидшуда аз тағирот муҳофизат карда мешаванд. Дар Java 8, маҷмӯаҳои баргардонидаи онҳо (ба монанди -
ArrayList
,
HashSet
, ва
HashMap
) хеле маъмуланд (мо метавонем онҳоро тағир диҳем), аммо ин далел метавонад дар релизҳои ояндаи JDK ислоҳ карда шавад. Ин ҳама дар бораи
Double brace
оғозёбӣ дар Java аст. Ин қолаб барои санҷишҳо ва намоишҳо қобor қабул аст, аммо барои истифодаи истеҳсолӣ кофӣ нест. Аз сабаби нуқсонҳои хоси худ, оғозкунии дукарата дар ин рӯзҳо, бахусус бо назардошти алтернативаҳои дастрас ба як намунаи зиддилағзиш табдил ёфтааст. Ман худам то ҳол ин сохтмонро барои оғоз кардани харитаҳои статикӣ истифода мебарам ва ҳамин тавр. Зеро
List
ман бартарӣ медиҳам, ки
Collections
бо якҷоякунӣ бо эҷод
Array.asList
дар созандаи он эҷод кунам. Ва агар ман Java 8 -ро истифода барам - тарроҳӣ бо истифода аз Stream API ва
collect()
.
Мақолаҳои марбут: Агар ба шумо аз ин дарс писанд омад ва хоҳед, ки дар бораи намунаҳои барномасозии Java, принсипҳо ва таҷрибаҳои беҳтарин маълумоти бештар гиред, шумо инчунин метавонед мақолаҳои дигари сайти моро тафтиш
кунед .
Хониши тавсияшаванда: Агар шумо хоҳед, ки дар бораи намунаҳо ва таҷрибаҳои беҳтарин маълумоти бештар гиред, шумо бояд
Барномасозии самараноки Ҷошуа Блокро хонед , ҳеҷ китоб ҷои онро гирифта наметавонад. Ва агар шумо аллакай забони Java-ро донед ва дар ҷустуҷӯи китобе дар бораи намунаҳои тарроҳӣ бошед, ки услуби ҳаҷвии муаррифии он ҷолиб ва хондан осон аст, ба
"Аввал сар. Намунаҳои тарроҳӣ" .
Аз тарҷумон: Ман дидаву дониста истинод ба китоби аслии Блох додам, зеро тарҷумаи он ба русӣ муваффақ набуд (масалан, Созандаи = созанда). |
Тарҷумаи мақола Initialization Double Brace дар Java чист? Намунаи зидди намуна (интишори октябри 2015).
GO TO FULL VERSION