JavaRush /Java blogi /Random-UZ /Ikki tomonlama qavsni ishga tushirish
Joysi
Daraja

Ikki tomonlama qavsni ishga tushirish

Guruhda nashr etilgan

1. Ikki tomonlama qavsni ishga tushirish

Ikki qavs yordamida ishga tushirish ( keyingi o'rinlarda Double qavsni ishga tushirish deb yuritiladi ) ro'yxat, to'plam va xarita kabi to'plamlarni deklaratsiyasi bilan bir vaqtda yaratish uchun Java vositasidir.
Ikki tomonlama qavsni ishga tushirish - 1
Qo'llab-quvvatlanadigan mahsulotlar yoki valyutalar ro'yxati kabi qattiq elementlarga ega ro'yxatlar kerak bo'lganda, ro'yxatni ishga tushirish bilan bir vaqtda e'lon qilish kodni o'qishni yaxshilaydi. Shu sababli Double brace initialization mashhurlikka erishmoqda, chunki kodda bir vaqtning o'zida ishga tushirish bilan to'plamlarni yaratishning boshqa standart usullari mavjud emas. Afsuski, boshqa dasturlash tillaridan farqli o'laroq, Java literal to'plamlarini qo'llab-quvvatlamaydi. Ushbu cheklov tufayli, hatto oz sonli elementlar bilanadd() o'zgartirilmaydigan ro'yxatni yaratish bizni kerakli elementlarni yakuniy o'rash bilan qo'shish uchun takroriy qo'ng'iroqlar ko'rinishida ko'plab kod qatorlarini yozishga majbur qiladi :
List<Integer> list = new ArrayList<>();
list.add(2);
list.add(3);
list.add(5);
list.add(7);
List<Integer> unmodifiableList = Collections.unmodifiableList(list);
Bu soddalashtirilishi mumkin bo'lgan keraksiz ortiqcha tavsif. Keling, statik ro'yxatlarni o'zimiz uchun qulay tarzda to'ldiraylik, ya'ni initsializatsiya paytida to'g'ridan-to'g'ri statik bloklarda, bu Double bracebizga initsializatsiya yordam beradi va hamma narsani bir qatorda yozishga imkon beradi:
List<Integer> list = Collections.unmodifiableList(new ArrayList<Integer>() {{
        add(2);
        add(3);
        add(5);
}});
Xuddi shunday, Double braceishga tushirish bizga qiymatlarni to'ldirishga yordam beradi va HashMap:
Map<Integer, String> intToString = new HashMap<Integer, String>(){{
         put(1, "one");
         put(2, "two");
         put(3, "three");
 }};
Bularning barchasi juda oqlangan ko'rinadi, lekin uning kamchiliklari bor, bu Double brace ishga tushirishni anti-naqshga aylantiradi. Biz ularni keyingi bobda batafsil ko'rib chiqamiz.

Ikki tomonlama qavsni ishga tushirishning ijobiy va salbiy tomonlari.

Doublebrace ishga tushirish anonim ichki sinf yaratish foydalanadi . Dastlab sirtda yashiringan narsa, lekin Double braceinitsializatsiya har safar undan foydalanganda uning namunasini keyingi ishga tushirish bilan sinf yaratadi. Bundan tashqari, ushbu xususiy sinfga yashirin havola ishlatiladi, bu bizni mumkin bo'lgan xotira oqishiga olib kelishi mumkin. Shuningdek, generiklar uchun sharpa operatoridan foydalana olmaysiz (olmos operatori < >), chunki biz anonim sinfning ichki qismiga kira olmaymiz.
(Tarjimondan: Yana bir bor batafsil ma'lumot:
birinchisidan keyin {ichki anonim sinf yaratiladi, ikkinchisidan so'ng {biz tashqi () maydonlari va usullariga kirishimiz mumkin bo'lgan sinf namunasini yaratishda ishga tushiriladi. anonim) sinfga nisbatan.)
Taroziga soling:
  1. Koddagi qatorlarni qisqartirish
  2. Bir ifodada yaratish va ishga tushirish.
Kamchiliklari:
  1. Sizdan yashiringan anonim sinf yaratish.
  2. Bu bizdan har safar foydalanganda uning namunasi uchun qo'shimcha xarajatlarga olib keladi.
  3. Har safar unga yashirin havola yaratiladi, bu esa xotira oqishiga olib kelishi mumkin.
Hukm: Yuqoridagi kamchiliklar va Double brace-ga alternativalar mavjudligi sababli, ishga tushirish Java dunyosida anti-naqsh sifatida ko'riladi. Mushukchani saqlang

Java-da Double brace inisializatsiyasiga alternativa

Yaxshi xabar shundaki, Java-da bir xil maqsadlarga erishishning boshqa usullari mavjud. Biz quyida ko'rsatilganidek, Collection sinfidagi Copy konstruktori yordamida ArrayListni yaratish va ishga tushirishni kodning bir qatorida amalga oshirishimiz mumkin:
List<Integer> list = Collections.unmodifiableList(new ArrayList<>(Arrays.asList(2, 3, 5)));
Arrays.asList()ArrayListbizga nusxa ko'chirish konstruktoriga o'tgan belgilangan uzunlik ro'yxatini qaytaradi . Arrays.asList()va dan qaytarilgan qat'iy uzunlikdagi ro'yxatlar orasidagi farqni yodda tuting Collections.unmodifiableList(): siz - ning elementlarini qo'sha olmaysiz yoki olib tashlay olmaysiz ArrayList, lekin elementni indeks bo'yicha o'zgartirishingiz mumkin set(), bu bilan qaytarilgan ro'yxat bilan qila olmaysiz Collections.unmodifiableList(). Agar siz kichik ro'yxatni olishni istasangiz, bu eng yaxshi usul, garchi u boshqa to'plamlar uchun kamroq shaffof bo'lsa-da , shuning uchun -a yaratishdan oldin Setuni yaratishingiz kerak bo'ladi . Lekin bu baribir Double brace initsializatsiyasidan ko'ra yaxshiroq, chunki bu holda har safar foydalanilganda qo'shimcha ichki anonim sinf yaratilmaydi. Agar siz Java 8 bilan ishlayotgan bo'lsangiz, boshqa muqobil usulingiz bor. JDK 8 Stream API chiqish usullarini to'plamga birlashtirib, kichik to'plamlar yaratishga yordam beradi : ListSetStream FactoryList
List<String> list = Collections.unmodifiableList(Stream.of("abc", "bcd", "cde").collect(toList()));
Buning o'rniga quyidagi usuldan Setfoydalanishingiz mumkin :Collectors.toSet()Collectors.toList()
Set<String> set = Collections.unmodifiableSet(Stream.of("abc", "bcd", "cde").collect(toSet()));
Aytgancha, Stream collectusullar ular yaratadigan to'plamlarning o'zgarishlardan himoyalanganligiga kafolat bermaydi. Java 8 da ular qaytargan to'plamlar (masalan, - ArrayList, HashSet, va HashMap) juda keng tarqalgan (biz ularni o'zgartirishimiz mumkin), ammo bu fakt kelajakdagi JDK nashrlarida tuzatilishi mumkin. Hozircha Java-da ishga tushirish haqida hammasi Double brace. Ushbu shablon testlar va demolar uchun qabul qilinadi, lekin ishlab chiqarishda foydalanish uchun yetarli emas. O'ziga xos kamchiliklari tufayli, qo'shaloq qavsni ishga tushirish, ayniqsa, mavjud alternativalarni hisobga olgan holda, bugungi kunda anti-naqshga aylandi. Men o'zim hali ham statik xaritalarni ishga tushirish uchun ushbu konstruktsiyadan foydalanaman va shu bilan. Men uning konstruktorida yaratish bilan birlashtirib Listyaratishni afzal ko'raman . Va agar men Java 8 dan foydalansam - Stream API-dan foydalangan holda dizayn va . Tegishli maqolalar: Agar sizga ushbu qo'llanma yoqqan bo'lsa va Java dasturlash naqshlari, tamoyillari va eng yaxshi amaliyotlari haqida ko'proq bilmoqchi bo'lsangiz, saytimizdagi boshqa maqolalarni ham ko'rib chiqishingiz mumkin . Tavsiya etilgan o'qish: Agar siz namunalar va eng yaxshi amaliyotlar haqida ko'proq bilmoqchi bo'lsangiz, Joshua Blochning "Effektiv dasturlash" kitobini o'qishingiz kerak , hech qanday kitob uning o'rnini bosa olmaydi. Va agar siz Java tilini allaqachon bilsangiz va dizayn naqshlari bo'yicha kitob izlayotgan bo'lsangiz, taqdimotining kulgili uslubi qiziqarli va o'qish oson, "Birinchi bosh. Dizayn naqshlari" . CollectionsArray.asListcollect()
Tarjimondan: Men ataylab Blochning asl kitobiga havola berdim, chunki uning rus tiliga tarjimasi muvaffaqiyatsiz tugadi (masalan, Quruvchi = konstruktor).
Maqolaning tarjimasi Java-da Double Brace Initialization nima? Anti Pattern Misol (2015 yil oktyabr oyida nashr etilgan).
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION