JavaRush /Java блогы /Random-KK /Қос жақшаны инициализациялау
Joysi
Деңгей

Қос жақшаны инициализациялау

Топта жарияланған

1. Қос жақшаны инициализациялау

Қос жақшаларды пайдаланып инициализациялау ( бұдан әрі - Қос жақшаны инициализациялау ) тізім, жиын және карта сияқты жиындарды олардың декларациясымен бір уақытта жасауға арналған Java құралы болып табылады.
Қос жақшаны инициализациялау - 1
Қолдау көрсетілетін өнімдер немесе валюталар тізімі сияқты бекітілген элементтері бар тізімдер қажет болғанда, тізімді инициализациялаумен бір уақытта жариялау 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инициализация сіз оны пайдаланған сайын оның данасын одан әрі инициализациялау арқылы сыныпты жасайды. Бұған қоса, осы жеке сыныпқа жасырын сілтеме пайдаланылады, бұл бізді жадтың ағып кетуіне әкелуі мүмкін. Сіз сондай-ақ генериктерге арналған елес операторды пайдалана алмайсыз (гауһар оператор < >), себебі біз анонимді сыныптың ішіне кіре алмаймыз.
(Аудармашыдан: Тағы да егжей-тегжейлі:
біріншіден кейін {ішкі анонимді класс жасалады, екіншісінен кейін {сыртқы ( өрістері мен әдістеріне қол жеткізе алатын сынып данасын жасау кезінде инициализация жүреді. анонимдік) сыныпқа қатысты.)
Артықшылықтары:
  1. Кодтағы жолдарды азайту
  2. Бір өрнекте жасау және инициализациялау.
Минустары:
  1. Сізден жасырылған анонимді класс жасау.
  2. Бұл біз оны пайдаланған сайын оның мысалы үшін қосымша шығындарды талап етеді.
  3. Әр жолы оған жасырын сілтеме жасалады, бұл жадтың ағып кетуіне әкелуі мүмкін.
Үкім: Жоғарыда келтірілген кемшіліктерге және Қос жақшаға баламалардың болуына байланысты инициализация 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 шығару әдістерін жинаққа біріктіру арқылы шағын жинақтарды жасауға көмектеседі : ListSetStream FactoryList
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 braceJava-де инициализация туралы бәрі осы. Бұл үлгі сынақтар мен демонстрациялар үшін жарамды, бірақ өндірісте пайдалану үшін жеткіліксіз. Өзінің тән кемшіліктеріне байланысты, қос жақшаны инициализациялау қазіргі уақытта, әсіресе қол жетімді баламаларды ескере отырып, қарсы үлгіге айналды. Мен әлі күнге дейін бұл құрылысты статикалық карталарды инициализациялау үшін қолданамын және солай. Мен оның конструкторында құрумен біріктіру арқылы Listжасауды қалаймын . Ал егер мен Java 8 қолданатын болсам - Stream API және . Қатысты мақалалар: Егер сізге осы оқулық ұнаса және Java бағдарламалау үлгілері, принциптері және ең жақсы тәжірибелері туралы көбірек білгіңіз келсе, біздің сайттағы басқа мақалаларды да қарағыңыз келуі мүмкін . Ұсынылатын әдебиет: үлгілер мен үздік тәжірибелер туралы көбірек білгіңіз келсе, Джошуа Блохтың «Тиімді бағдарламалау» кітабын оқуыңыз керек , оның орнын ешбір кітап баса алмайды. Ал егер сіз Java тілін жетік меңгерген болсаңыз және дизайн үлгілері туралы кітап іздесеңіз, оның презентациясының әзіл-оспақ стилі қызықты және оқуға оңай болса, «Алдымен бас. Дизайн үлгілері» . CollectionsArray.asListcollect()
Аудармашыдан: Мен Блохтың түпнұсқа кітабына сілтемені әдейі бердім, өйткені оның орыс тіліне аудармасы сәтсіз болды (мысалы, Builder = constructor).
Мақаланың аудармасы Java тіліндегі Double Brace Initialization дегеніміз не? Anti Pattern мысалы (2015 жылдың қазан айында жарияланған).
Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION