1. Inisialisasi kurung kurawal ganda
Inisialisasi menggunakan kurung kurawal ganda (
selanjutnya disebut Inisialisasi kurung kurawal ganda ) adalah alat Java untuk membuat koleksi seperti daftar, set, dan peta secara bersamaan dengan deklarasinya.
Saat Anda memerlukan daftar dengan elemen tetap, seperti daftar produk atau mata uang yang didukung, mendeklarasikan daftar tersebut bersamaan dengan inisialisasi akan meningkatkan keterbacaan kode. Inilah sebabnya inisialisasi kurung kurawal ganda semakin populer, karena tidak ada metode standar lain untuk membuat koleksi dengan inisialisasi kode secara simultan. Sayangnya, tidak seperti bahasa pemrograman lain, Java tidak mendukung kumpulan literal. Karena keterbatasan ini, membuat unmodifiedList
dengan sejumlah kecil elemen memaksa kita untuk menulis banyak baris kode dalam bentuk panggilan berulang
add()
untuk menambahkan elemen yang diinginkan dengan pembungkusan akhir:
List<Integer> list = new ArrayList<>();
list.add(2);
list.add(3);
list.add(5);
list.add(7);
List<Integer> unmodifiableList = Collections.unmodifiableList(list);
Ini adalah deskripsi berlebihan yang tidak perlu dan dapat disederhanakan. Mari kita isi daftar statis dengan cara yang nyaman bagi kita, yaitu langsung di blok statis selama inisialisasi, yang
Double brace
akan membantu kita dengan inisialisasi, memungkinkan kita menulis semuanya dalam satu baris:
List<Integer> list = Collections.unmodifiableList(new ArrayList<Integer>() {{
add(2);
add(3);
add(5);
}});
Demikian pula,
Double brace
inisialisasi akan membantu kita mengisi nilai dan
HashMap
:
Map<Integer, String> intToString = new HashMap<Integer, String>(){{
put(1, "one");
put(2, "two");
put(3, "three");
}};
Semuanya terlihat begitu elegan, namun memiliki kekurangan, yaitu menjadikan inisialisasi kurung kurawal ganda sebagai anti-pola. Kita akan melihatnya lebih lanjut di bab berikutnya.
Pro dan kontra dari inisialisasi kurung kurawal ganda.
Double
inisialisasi brace menggunakan pembuatan kelas
dalam anonim . Apa yang awalnya tersembunyi di permukaan, namun,
Double brace
inisialisasi menciptakan kelas dengan inisialisasi lebih lanjut dari instance-nya setiap kali Anda menggunakannya. Selain itu, referensi tersembunyi ke kelas privat ini digunakan, yang dapat mengarahkan kita pada kemungkinan kebocoran memori. Anda juga tidak dapat menggunakan operator hantu untuk obat generik (operator berlian < >), karena kami tidak dapat mengakses bagian dalam kelas anonim.
(Dari penerjemah: Sekali lagi lebih detail:
setelah yang pertama { , kelas anonim internal dibuat, setelah yang kedua, { inisialisasi terjadi saat membuat instance kelas, di mana kita memiliki akses ke bidang dan metode eksternal ( relatif terhadap kelas anonim).) |
Kelebihan:
- Mengurangi baris dalam kode
- Penciptaan dan inisialisasi dalam satu ekspresi.
Minus:
- Membuat kelas anonim yang disembunyikan dari Anda.
- Yang membuat kami mengeluarkan biaya tambahan untuk contohnya setiap kali kami menggunakannya.
- Setiap kali referensi tersembunyi dibuat, yang dapat menyebabkan kebocoran memori.
Putusan: Karena kekurangan di atas dan adanya alternatif selain kurung kurawal ganda, inisialisasi dianggap sebagai anti-pola di dunia Java.
Alternatif untuk inisialisasi kurung kurawal ganda di Java
Kabar baiknya adalah ada cara lain untuk mencapai tujuan yang sama di Jawa. Kita dapat mengimplementasikan dalam satu baris kode pembuatan dan inisialisasi ArrayList menggunakan konstruktor Copy dari kelas Collection seperti yang ditunjukkan di bawah ini:
List<Integer> list = Collections.unmodifiableList(new ArrayList<>(Arrays.asList(2, 3, 5)));
Arrays.asList()
akan mengembalikan kepada kita daftar dengan panjang tetap yang diteruskan ke
ArrayList
konstruktor salinan. Ingatlah perbedaan antara daftar dengan panjang tetap yang dikembalikan dari
Arrays.asList()
dan
Collections.unmodifiableList()
: Anda tidak dapat menambah atau menghapus elemen
ArrayList
- , tetapi Anda dapat mengubah elemen berdasarkan indeks menggunakan
set()
, yang tidak dapat Anda lakukan dengan daftar yang dikembalikan oleh
Collections.unmodifiableList()
. Jika Anda ingin mendapatkan daftar kecil, ini adalah cara terbaik, meskipun kurang transparan untuk
Set
koleksi lain, jadi Anda harus membuatnya
List
sebelum membuat
Set
-a. Tapi ini masih lebih baik daripada inisialisasi kurung kurawal ganda, karena dalam kasus ini kelas anonim internal tambahan tidak dibuat setiap kali digunakan. Jika Anda menjalankan Java 8, Anda memiliki metode alternatif lain. JDK 8 Stream API akan membantu Anda membuat koleksi kecil dengan menggabungkan
Stream Factory
metode keluaran ke dalam koleksi
List
:
List<String> list = Collections.unmodifiableList(Stream.of("abc", "bcd", "cde").collect(toList()));
Untuk itu
Set
Anda bisa menggunakan
Collectors.toSet()
caranya seperti
Collectors.toList()
di bawah ini:
Set<String> set = Collections.unmodifiableSet(Stream.of("abc", "bcd", "cde").collect(toSet()));
Omong-omong,
Stream collect
metode tidak menjamin bahwa koleksi yang mereka hasilkan terlindungi dari perubahan. Di Java 8, koleksi yang mereka kembalikan (seperti -
ArrayList
,
HashSet
, dan
HashMap
) cukup umum (kita dapat mengubahnya), namun fakta ini mungkin diperbaiki pada rilis JDK mendatang. Itu saja untuk saat ini tentang
Double brace
inisialisasi di Java. Templat ini dapat diterima untuk pengujian dan demo, namun tidak cukup baik untuk penggunaan produksi. Karena kelemahan bawaannya, inisialisasi kurung kurawal ganda telah menjadi anti-pola saat ini, terutama mengingat alternatif yang tersedia. Saya sendiri masih menggunakan konstruksi ini untuk menginisialisasi peta statis dan hanya itu. Karena
List
saya lebih suka membuat
Collections
dengan menggabungkan dengan membuat
Array.asList
di konstruktornya. Dan jika saya menggunakan Java 8 - desain menggunakan Stream API dan
collect()
.
Artikel Terkait: Jika Anda menikmati tutorial ini dan ingin mempelajari lebih lanjut tentang pola, prinsip, dan praktik terbaik pemrograman Java, Anda mungkin juga ingin membaca artikel lain di
situs kami .
Bacaan yang Direkomendasikan: Jika Anda ingin mempelajari lebih lanjut tentang pola dan praktik terbaik, Anda harus membaca
Pemrograman Efektif oleh Joshua Bloch , tidak ada buku yang dapat menggantikannya. Dan jika Anda sudah mahir berbahasa Java dan sedang mencari buku tentang pola desain yang gaya penyajiannya lucu menarik dan mudah dibaca, perhatikan
“Head First. Pola desain" .
Dari penerjemah: Saya sengaja memberikan tautan ke buku asli Bloch, karena terjemahannya ke dalam bahasa Rusia tidak berhasil (misalnya, Builder = konstruktor). |
Terjemahan artikel Apa itu Inisialisasi Double Brace di Java? Contoh Anti Pola (diterbitkan Oktober 2015).
GO TO FULL VERSION