JavaRush /Java блогу /Random-KY /Кош кашаа инициализациясы
Joysi
Деңгээл

Кош кашаа инициализациясы

Группада жарыяланган

1. Кош кашаа инициализациясы

Кош кашааларды колдонуу менен инициализациялоо ( мындан ары Кош кашаа инициализациясы ) тизме, топтом жана карта сыяктуу коллекцияларды алардын декларациясы менен бир убакта түзүү үчүн Java куралы.
Кош кашаа инициализациясы - 1
Колдоого алынган өнүмдөрдүн же валюталардын тизмеси сыяктуу туруктуу элементтери бар тизмелер керек болгондо, тизмени инициализациялоо менен бир убакта жарыялоо 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инициализация сиз аны колдонгон сайын анын инстанциясын андан ары инициализациялоо менен классты түзөт. Мындан тышкары, бул купуя класска жашыруун шилтеме колдонулат, бул бизди эс тутумдун агып кетишине алып келиши мүмкүн. Сиз ошондой эле генериктер үчүн арбак операторун колдоно албайсыз (бриллиант оператор < >), анткени биз анонимдүү класстын ичине кире албайбыз.
(Котормочудан: Дагы бир жолу кененирээк:
биринчиден кийин {, ички анонимдүү класс түзүлөт, экинчиден кийин, {класстын экземплярын түзүүдө инициализация болот, анда биз тышкы класстын талааларына жана ыкмаларына кире алабыз ( анонимдүү) класска карата.)
Артыкчылыктары:
  1. Коддогу саптарды кыскартуу
  2. Бир сөз айкашында түзүү жана баштоо.
Минустары:
  1. Сизден жашырылган жашыруун класс түзүү.
  2. Бул биз аны колдонгон сайын анын мисалы үчүн кошумча чыгымдарды талап кылат.
  3. Ар бир жолу ага жашыруун шилтеме түзүлүп, эс тутумдун агып кетишине алып келиши мүмкүн.
Өкүм: Жогорудагы кемч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 сизге чыгаруу ыкмаларын коллекцияга айкалыштыруу менен чакан коллекцияларды түзүүгө жардам берет : 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'да инициализация жөнүндө бардыгы ушул. Бул шаблон тесттер жана демонстрациялар үчүн алгылыктуу, бирок өндүрүштө колдонуу үчүн жетиштүү эмес. Өзүнүн мүнөздүү кемчorктеринен улам, кош кашаа инициализациясы азыркы күндө анти-үлгүгө айланды, айрыкча жеткorктүү альтернативаларды эске алганда. Мен өзүм дагы бул курулушту статикалык карталарды инициализациялоо үчүн колдоном жана ушуну менен бүттү. Анткени мен анын конструкторунда түзүү менен айкалыштыруу менен Listтүзүүнү артык көрөм . Жана эгер мен Java 8ди колдонсом - Stream API жана . Тиешелүү макалалар: Эгер сизге бул окуу куралы жакса жана Java программалоо үлгүлөрү, принциптери жана мыкты тажрыйбалары жөнүндө көбүрөөк билгиңиз келсе, биздин сайттагы башка макалаларды да карап чыксаңыз болот . Сунушталган окуу: Эгерде сиз үлгүлөр жана мыкты тажрыйбалар жөнүндө көбүрөөк билгиңиз келсе, анда Жошуа Блоктун Эффективдүү программалоосун окушуңуз керек , анын ордун эч бир китеп баса алbyte. Эгерде сиз Java тorн жакшы билсеңиз жана дизайн үлгүлөрү боюнча китеп издеп жатсаңыз, анын презентациясынын күлкүлүү стor кызыктуу жана окууга оңой, көңүл буруңуз “Биринчи баш. Дизайн үлгүлөрү" . CollectionsArray.asListcollect()
Котормочудан: Мен атайылап Блохтун оригиналдуу китебине шилтеме бердим, анткени анын орус тorне котормосу ийгorксиз болгон (мисалы, Builder = constructor).
Макаланын котормосу Javaдагы Double Brace Initialization деген эмне? Anti Pattern Example (2015-жылдын октябрында жарыяланган).
Комментарийлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION