1. Кош кашаа инициализациясы
Кош кашааларды колдонуу менен инициализациялоо (
мындан ары Кош кашаа инициализациясы ) тизме, топтом жана карта сыяктуу коллекцияларды алардын декларациясы менен бир убакта түзүү үчүн Java куралы.
Колдоого алынган өнүмдөрдүн же валюталардын тизмеси сыяктуу туруктуу элементтери бар тизмелер керек болгондо, тизмени инициализациялоо менен бир убакта жарыялоо codeдун окулушун жакшыртат. Дал ушул себептен кош кашаа инициализациясы популярдуулукка ээ болууда, анткени codeдо бир убакта инициализациялоо менен коллекцияларды түзүүнүн башка стандарттуу ыкмалары жок. Тилекке каршы, башка программалоо тилдеринен айырмаланып, Java литералдар жыйнактарын колдобойт. Бул чектөөдөн улам, аз сандагы элементтерден
турганadd()
unmodifiableList түзүү бизди акыркы ороп менен керектүү элементтерди кошуу үчүн кайра-кайра чалуулар түрүндө 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");
}};
Мунун баары абдан жарашыктуу көрүнөт, бирок анын кемчorктери бар, алар Double кашаа инициализациясын анти-үлгүгө айлантат. Биз аларды кийинки бөлүмдө дагы карап чыгабыз.
Кош кашаа инициализациясынын жакшы жана жаман жактары.
Double
кашаа инициализациясы анонимдүү ички классты түзүүнү колдонот . Башында бетинде жашырылган нерсе,
Double brace
инициализация сиз аны колдонгон сайын анын инстанциясын андан ары инициализациялоо менен классты түзөт. Мындан тышкары, бул купуя класска жашыруун шилтеме колдонулат, бул бизди эс тутумдун агып кетишине алып келиши мүмкүн. Сиз ошондой эле генериктер үчүн арбак операторун колдоно албайсыз (бриллиант оператор < >), анткени биз анонимдүү класстын ичине кире албайбыз.
(Котормочудан: Дагы бир жолу кененирээк:
биринчиден кийин { , ички анонимдүү класс түзүлөт, экинчиден кийин, { класстын экземплярын түзүүдө инициализация болот, анда биз тышкы класстын талааларына жана ыкмаларына кире алабыз ( анонимдүү) класска карата.) |
Артыкчылыктары:
- Коддогу саптарды кыскартуу
- Бир сөз айкашында түзүү жана баштоо.
Минустары:
- Сизден жашырылган жашыруун класс түзүү.
- Бул биз аны колдонгон сайын анын мисалы үчүн кошумча чыгымдарды талап кылат.
- Ар бир жолу ага жашыруун шилтеме түзүлүп, эс тутумдун агып кетишине алып келиши мүмкүн.
Өкүм: Жогорудагы кемчorктерден жана Double кашаага альтернативалардын бар экендигинен улам, инициализация Java дүйнөсүндө анти-үлгү катары каралат.
Java'да Double кашаа инициализациясынын альтернативалары
Жакшы кабар 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'да инициализация жөнүндө бардыгы ушул. Бул шаблон тесттер жана демонстрациялар үчүн алгылыктуу, бирок өндүрүштө колдонуу үчүн жетиштүү эмес. Өзүнүн мүнөздүү кемчorктеринен улам, кош кашаа инициализациясы азыркы күндө анти-үлгүгө айланды, айрыкча жеткorктүү альтернативаларды эске алганда. Мен өзүм дагы бул курулушту статикалык карталарды инициализациялоо үчүн колдоном жана ушуну менен бүттү. Анткени мен анын конструкторунда түзүү менен айкалыштыруу менен
List
түзүүнү артык көрөм . Жана эгер мен Java 8ди колдонсом - Stream API жана .
Тиешелүү макалалар: Эгер сизге бул окуу куралы жакса жана Java программалоо үлгүлөрү, принциптери жана мыкты тажрыйбалары жөнүндө көбүрөөк билгиңиз келсе, биздин сайттагы башка макалаларды да карап чыксаңыз болот .
Сунушталган окуу: Эгерде сиз үлгүлөр жана мыкты тажрыйбалар жөнүндө көбүрөөк билгиңиз келсе, анда
Жошуа Блоктун Эффективдүү программалоосун окушуңуз керек , анын ордун эч бир китеп баса алbyte. Эгерде сиз Java тorн жакшы билсеңиз жана дизайн үлгүлөрү боюнча китеп издеп жатсаңыз, анын презентациясынын күлкүлүү стor кызыктуу жана окууга оңой, көңүл буруңуз
“Биринчи баш. Дизайн үлгүлөрү" .
Collections
Array.asList
collect()
Котормочудан: Мен атайылап Блохтун оригиналдуу китебине шилтеме бердим, анткени анын орус тorне котормосу ийгorксиз болгон (мисалы, Builder = constructor). |
Макаланын котормосу Javaдагы Double Brace Initialization деген эмне? Anti Pattern Example (2015-жылдын октябрында жарыяланган).
GO TO FULL VERSION