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.
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 brace
bizga 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 brace
ishga 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.
Double
brace ishga tushirish anonim ichki sinf yaratish foydalanadi . Dastlab sirtda yashiringan narsa, lekin
Double brace
initsializatsiya 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:
- Koddagi qatorlarni qisqartirish
- Bir ifodada yaratish va ishga tushirish.
Kamchiliklari:
- Sizdan yashiringan anonim sinf yaratish.
- Bu bizdan har safar foydalanganda uning namunasi uchun qo'shimcha xarajatlarga olib keladi.
- 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.
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()
ArrayList
bizga 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
Set
uni 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 :
List
Set
Stream Factory
List
List<String> list = Collections.unmodifiableList(Stream.of("abc", "bcd", "cde").collect(toList()));
Buning o'rniga quyidagi usuldan
Set
foydalanishingiz mumkin :
Collectors.toSet()
Collectors.toList()
Set<String> set = Collections.unmodifiableSet(Stream.of("abc", "bcd", "cde").collect(toSet()));
Aytgancha,
Stream collect
usullar 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
List
yaratishni 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" .
Collections
Array.asList
collect()
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).
GO TO FULL VERSION