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.
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 brace
baş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 brace
baş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.
Double
brace inisializasiyası anonim daxili sinifin yaradılmasından istifadə edir . Başlanğıcda səthdə gizlədilən şey, lakin
Double brace
inisializasiya 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:
- Kodda sətirlərin azaldılması
- Bir ifadədə yaradılması və işə salınması.
Minuslar:
- Sizdən gizli anonim sinif yaratmaq.
- Hansı ki, hər dəfə istifadə etdiyimiz zaman onun nümunəsi üçün bizə əlavə xərclər başa gəlir.
- 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.
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()
ArrayList
surə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
Set
onu 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 :
List
Set
Stream Factory
List
List<String> list = Collections.unmodifiableList(Stream.of("abc", "bcd", "cde").collect(toList()));
Bunun əvəzinə aşağıdakı metoddan
Set
istifadə 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 collect
metodlar 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 brace
Java-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
List
yaratmağ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" .
Collections
Array.asList
collect()
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).
GO TO FULL VERSION