1. Қос жақшаны инициализациялау
Қос жақшаларды пайдаланып инициализациялау (
бұдан әрі - Қос жақшаны инициализациялау ) тізім, жиын және карта сияқты жиындарды олардың декларациясымен бір уақытта жасауға арналған Java құралы болып табылады.
Қолдау көрсетілетін өнімдер немесе валюталар тізімі сияқты бекітілген элементтері бар тізімдер қажет болғанда, тізімді инициализациялаумен бір уақытта жариялау codeты оқу мүмкіндігін жақсартады. Дәл осы себепті қос жақшаны инициализациялау танымал болуда, өйткені codeта бір мезгілде инициализациясы бар жинақтарды жасаудың басқа стандартты әдістері жоқ. Өкінішке орай, басқа бағдарламалау тілдерінен айырмашылығы, Java литералдар жинақтарын қолдамайды.
Осы шектеуге байланысты, тіпті аз элементтер саны бар unmodifiableList жасау бізді
add()
соңғы ораумен қажетті элементтерді қосу үшін қайталанатын қоңыраулар түріндегі көптеген code жолдарын жазуға мәжбүр етеді :
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 brace инициализациясын анти-үлгіге айналдырады. Оларды келесі тарауда толығырақ қарастырамыз.
Қос жақшаны инициализациялаудың артықшылықтары мен кемшіліктері.
Double
жақшаны инициализациялау анонимді ішкі сыныпты құруды пайдаланады . Бастапқыда бетінде жасырылған нәрсе, алайда,
Double brace
инициализация сіз оны пайдаланған сайын оның данасын одан әрі инициализациялау арқылы сыныпты жасайды. Бұған қоса, осы жеке сыныпқа жасырын сілтеме пайдаланылады, бұл бізді жадтың ағып кетуіне әкелуі мүмкін. Сіз сондай-ақ генериктерге арналған елес операторды пайдалана алмайсыз (гауһар оператор < >), себебі біз анонимді сыныптың ішіне кіре алмаймыз.
(Аудармашыдан: Тағы да егжей-тегжейлі:
біріншіден кейін { ішкі анонимді класс жасалады, екіншісінен кейін { сыртқы ( өрістері мен әдістеріне қол жеткізе алатын сынып данасын жасау кезінде инициализация жүреді. анонимдік) сыныпқа қатысты.) |
Артықшылықтары:
- Кодтағы жолдарды азайту
- Бір өрнекте жасау және инициализациялау.
Минустары:
- Сізден жасырылған анонимді класс жасау.
- Бұл біз оны пайдаланған сайын оның мысалы үшін қосымша шығындарды талап етеді.
- Әр жолы оған жасырын сілтеме жасалады, бұл жадтың ағып кетуіне әкелуі мүмкін.
Үкім: Жоғарыда келтірілген кемшіліктерге және Қос жақшаға баламалардың болуына байланысты инициализация Java әлемінде анти-үлгі ретінде қарастырылады.
Java тіліндегі қос жақшаны инициализациялаудың баламалары
Жақсы жаңалық - Java-да бірдей мақсаттарға жетудің басқа жолдары бар. Төменде көрсетілгендей Collection сыныбынан Copy конструкторы арқылы ArrayList құруды және баптандыруды codeтың бір жолында жүзеге асыра аламыз:
List<Integer> list = Collections.unmodifiableList(new ArrayList<>(Arrays.asList(2, 3, 5)));
Arrays.asList()
ArrayList
көшіру конструкторына берілген тұрақты ұзындықтың тізімін қайтарады .
Arrays.asList()
және арқылы қайтарылған тіркелген ұзындықты тізімдер арасындағы айырмашылықты есте сақтаңыз
Collections.unmodifiableList()
: - элементтерін қосу немесе жою мүмкін емес
ArrayList
, бірақ элементті индекс арқылы өзгертуге болады
set()
, оны қайтарылған тізіммен жасай алмайсыз
Collections.unmodifiableList()
. Кішкентай тізімді алғыңыз келсе, бұл басқа жинақтар үшін мөлдірлігі азырақ болса да, ең жақсы әдіс, сондықтан -a жасамас бұрын
Set
оны жасауыңыз керек . Бірақ бұл Double brace инициализациясынан жақсырақ, өйткені бұл жағдайда қосымша ішкі анонимді класс ол пайдаланылған сайын жасалмайды. Егер сіз Java 8 нұсқасын іске қоссаңыз, сізде басқа балама әдіс бар. JDK 8 Stream API шығару әдістерін жинаққа біріктіру арқылы шағын жинақтарды жасауға көмектеседі :
List
Set
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-де инициализация туралы бәрі осы. Бұл үлгі сынақтар мен демонстрациялар үшін жарамды, бірақ өндірісте пайдалану үшін жеткіліксіз. Өзінің тән кемшіліктеріне байланысты, қос жақшаны инициализациялау қазіргі уақытта, әсіресе қол жетімді баламаларды ескере отырып, қарсы үлгіге айналды. Мен әлі күнге дейін бұл құрылысты статикалық карталарды инициализациялау үшін қолданамын және солай. Мен оның конструкторында құрумен біріктіру арқылы
List
жасауды қалаймын . Ал егер мен Java 8 қолданатын болсам - Stream API және .
Қатысты мақалалар: Егер сізге осы оқулық ұнаса және Java бағдарламалау үлгілері, принциптері және ең жақсы тәжірибелері туралы көбірек білгіңіз келсе, біздің сайттағы басқа мақалаларды да қарағыңыз келуі мүмкін .
Ұсынылатын әдебиет: үлгілер мен үздік тәжірибелер туралы көбірек білгіңіз келсе,
Джошуа Блохтың «Тиімді бағдарламалау» кітабын оқуыңыз керек , оның орнын ешбір кітап баса алмайды. Ал егер сіз Java тілін жетік меңгерген болсаңыз және дизайн үлгілері туралы кітап іздесеңіз, оның презентациясының әзіл-оспақ стилі қызықты және оқуға оңай болса,
«Алдымен бас. Дизайн үлгілері» .
Collections
Array.asList
collect()
Аудармашыдан: Мен Блохтың түпнұсқа кітабына сілтемені әдейі бердім, өйткені оның орыс тіліне аудармасы сәтсіз болды (мысалы, Builder = constructor). |
Мақаланың аудармасы Java тіліндегі Double Brace Initialization дегеніміз не? Anti Pattern мысалы (2015 жылдың қазан айында жарияланған).
GO TO FULL VERSION