JavaRush /Java Blogu /Random-AZ /İkiqat mötərizənin işə salınması
Joysi
Səviyyə

İkiqat mötərizənin işə salınması

Qrupda dərc edilmişdir

1. İkiqat mötərizənin işə salınması

Qoşa mötərizələrdən istifadə edərək başlatma ( bundan sonra Qoşa mötərizənin başlanğıcı adlandırılacaq ) onların elanı ilə eyni vaxtda siyahı, set və xəritə kimi kolleksiyalar yaratmaq üçün Java alətidir.
İkiqat mötərizənin işə salınması - 1
Dəstəklənən məhsulların və ya valyutaların siyahısı kimi sabit elementləri olan siyahılara ehtiyacınız olduqda, siyahını işə salmaqla eyni vaxtda elan etmək kodun oxunuşunu yaxşılaşdırır. Kodda eyni vaxtda başlatma ilə kolleksiyalar yaratmaq üçün başqa standart üsullar olmadığı üçün Double brace inisializasiyası populyarlıq qazanır. Təəssüf ki, digər proqramlaşdırma dillərindən fərqli olaraq, Java literal kolleksiyalarını dəstəkləmir. Bu məhdudiyyətə görə, hətta az sayda elementi olanadd() dəyişdirilə bilməyənList yaratmaq bizi son sarğı ilə istədiyiniz elementləri əlavə etmək üçün təkrar zənglər şəklində çoxlu kod sətirləri yazmağa məcbur edir :
List<Integer> list = new ArrayList<>();
list.add(2);
list.add(3);
list.add(5);
list.add(7);
List<Integer> unmodifiableList = Collections.unmodifiableList(list);
Bu, sadələşdirilə bilən lazımsız lazımsız təsvirdir. Statik siyahıları bizim üçün əlverişli şəkildə dolduraq, yəni inisializasiya zamanı birbaşa statik bloklarda, bu, Double bracebaşlanğıclaşdırma bizə kömək edəcək və hər şeyi bir sətirdə yazmağa imkan verəcəkdir:
List<Integer> list = Collections.unmodifiableList(new ArrayList<Integer>() {{
        add(2);
        add(3);
        add(5);
}});
Eynilə, Double bracebaşlatma bizə dəyərləri doldurmağa kömək edəcək və HashMap:
Map<Integer, String> intToString = new HashMap<Integer, String>(){{
         put(1, "one");
         put(2, "two");
         put(3, "three");
 }};
Hamısı çox zərif görünür, lakin onun çatışmazlıqları var, bu da Double brace inisializasiyasını anti-naxışa çevirir. Növbəti fəsildə onlara daha ətraflı baxacağıq.

İkiqat mötərizənin işə salınmasının müsbət və mənfi cəhətləri.

Doublebrace inisializasiyası anonim daxili sinifin yaradılmasından istifadə edir . Başlanğıcda səthdə gizlədilən şey, lakin Double braceinisializasiya hər dəfə istifadə etdiyiniz zaman onun instansiyasının daha da işə salınması ilə bir sinif yaradır. Bundan əlavə, bu özəl sinfə gizli istinad istifadə olunur ki, bu da bizi mümkün yaddaş sızmalarına gətirib çıxara bilər. Siz həmçinin generiklər üçün xəyal operatorundan istifadə edə bilməzsiniz (almaz operator < >), çünki biz anonim sinfin içərisinə daxil ola bilmirik.
(Tərcüməçidən: Bir daha ətraflı:
birincidən sonra {daxili anonim sinif yaradılır, ikincidən sonra {xarici ( sahələrə və metodlara çıxışımız olan sinif nümunəsini yaratarkən inisializasiya baş verir. anonim) sinfinə nisbətən.)
Müsbət cəhətləri:
  1. Kodda sətirlərin azaldılması
  2. Bir ifadədə yaradılması və işə salınması.
Minuslar:
  1. Sizdən gizli anonim sinif yaratmaq.
  2. Hansı ki, hər dəfə istifadə etdiyimiz zaman onun nümunəsi üçün bizə əlavə xərclər başa gəlir.
  3. Hər dəfə ona gizli istinad yaradılır ki, bu da yaddaşın sızmasına səbəb ola bilər.
Hökm: Yuxarıdakı mənfi cəhətlərə və Double brace-ə alternativlərin mövcudluğuna görə başlatma Java dünyasında anti-naxış kimi qəbul edilir. Pişiyi xilas et

Java-da Double brace inisializasiyasına alternativlər

Yaxşı xəbər budur ki, Java-da eyni məqsədlərə çatmağın başqa yolları da var. Aşağıda göstərildiyi kimi Collection sinfindən Copy konstruktorundan istifadə edərək ArrayList-in yaradılması və işə salınmasını bir kod sətirində həyata keçirə bilərik:
List<Integer> list = Collections.unmodifiableList(new ArrayList<>(Arrays.asList(2, 3, 5)));
Arrays.asList()ArrayListsurət konstruktoruna ötürülən sabit uzunluq siyahısını bizə qaytaracaq . Arrays.asList()və -dən qaytarılan sabit uzunluqlu siyahılar arasındakı fərqi unutmayın Collections.unmodifiableList(): - elementlərini əlavə edə və ya silə bilməzsiniz ArrayList, lakin elementi indekslə dəyişdirə bilərsiniz set(), lakin onu geri qaytarılan siyahı ilə edə bilməzsiniz Collections.unmodifiableList(). Kiçik bir siyahı əldə etmək istəyirsinizsə, bu, ən yaxşı yoldur, baxmayaraq ki, digər kolleksiyalar üçün daha az şəffaf olacaq , ona görə də -a yaratmazdan əvvəl Setonu yaratmalı olacaqsınız . Lakin bu, Double brace inisializasiyasından daha yaxşıdır, çünki bu halda hər dəfə istifadə ediləndə əlavə daxili anonim sinif yaradılmır. Əgər Java 8 ilə işləyirsinizsə, başqa bir alternativ metodunuz var. JDK 8 Stream API çıxış üsullarını kolleksiyada birləşdirərək kiçik kolleksiyalar yaratmağınıza kömək edəcək : ListSetStream FactoryList
List<String> list = Collections.unmodifiableList(Stream.of("abc", "bcd", "cde").collect(toList()));
Bunun əvəzinə aşağıdakı metoddan Setistifadə edə bilərsiniz : Collectors.toSet()Collectors.toList()
Set<String> set = Collections.unmodifiableSet(Stream.of("abc", "bcd", "cde").collect(toSet()));
Yeri gəlmişkən, Stream collectmetodlar onların yaratdığı kolleksiyaların dəyişikliklərdən qorunduğuna zəmanət vermir. Java 8-də onların qaytardıqları kolleksiyalar (məsələn - ArrayList, HashSet, və HashMap) olduqca ümumidir (biz onları dəyişə bilərik), lakin bu fakt gələcək JDK buraxılışlarında düzəldilə bilər. Double braceJava-da başlatma haqqında hələlik bunlardır . Bu şablon testlər və nümayişlər üçün məqbuldur, lakin istehsalda istifadə üçün kifayət qədər yaxşı deyil. Özünə xas olan çatışmazlıqlara görə, ikiqat mötərizənin işə salınması bu günlərdə, xüsusən də mövcud alternativləri nəzərə alaraq, anti-naxış halına gəldi. Mən özüm hələ də statik xəritələri işə salmaq üçün bu konstruksiyadan istifadə edirəm və budur. Çünki konstruktorda yaratmaqla birləşdirərək Listyaratmağa üstünlük verirəm . Java 8-dən istifadə etsəm - Stream API-dən istifadə edən dizayn və . Əlaqədar Məqalələr: Əgər bu dərslikdən zövq aldınızsa və Java proqramlaşdırma nümunələri, prinsipləri və ən yaxşı təcrübələri haqqında daha çox öyrənmək istəyirsinizsə, saytımızdakı digər məqalələrə də baxmaq istəyə bilərsiniz . Tövsiyə olunan oxu: Nümunələr və ən yaxşı təcrübələr haqqında daha çox öyrənmək istəyirsinizsə, Joshua Bloch tərəfindən Effektiv Proqramlaşdırmanı oxumalısınız , heç bir kitab onun yerini tuta bilməz. Əgər siz artıq Java dilini mükəmməl bilirsinizsə və dizayn nümunələri haqqında, təqdimatının yumoristik üslubu maraqlı və oxunması asan olan kitab axtarırsınızsa, “Əvvəlcə başınıza. Dizayn nümunələri" . CollectionsArray.asListcollect()
Tərcüməçidən: Mən qəsdən Blochun orijinal kitabına keçid verdim, çünki onun rus dilinə tərcüməsi uğursuz oldu (məsələn, Builder = constructor).
Məqalənin tərcüməsi Java-da Double Brace Initialization nədir? Anti Pattern Nümunəsi (Oktyabr 2015-ci ildə nəşr olunub).
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION