JavaRush /Java Blog /Random-ID /Inisialisasi kurung kurawal ganda
Joysi
Level 41

Inisialisasi kurung kurawal ganda

Dipublikasikan di grup Random-ID

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.
Inisialisasi kurung kurawal ganda - 1
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 braceakan 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 braceinisialisasi 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.

Doubleinisialisasi brace menggunakan pembuatan kelas dalam anonim . Apa yang awalnya tersembunyi di permukaan, namun, Double braceinisialisasi 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:
  1. Mengurangi baris dalam kode
  2. Penciptaan dan inisialisasi dalam satu ekspresi.
Minus:
  1. Membuat kelas anonim yang disembunyikan dari Anda.
  2. Yang membuat kami mengeluarkan biaya tambahan untuk contohnya setiap kali kami menggunakannya.
  3. 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. Selamatkan anak kucing itu

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 ArrayListkonstruktor 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 Setkoleksi lain, jadi Anda harus membuatnya Listsebelum 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 Factorymetode keluaran ke dalam koleksi List:
List<String> list = Collections.unmodifiableList(Stream.of("abc", "bcd", "cde").collect(toList()));
Untuk itu SetAnda 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 collectmetode 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 braceinisialisasi 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 Listsaya lebih suka membuat Collectionsdengan menggabungkan dengan membuat Array.asListdi 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).
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION