JavaRush /Blog Java /Random-MS /Inisialisasi pendakap berganda
Joysi
Tahap

Inisialisasi pendakap berganda

Diterbitkan dalam kumpulan

1. Pemulaan pendakap berganda

Permulaan menggunakan pendakap berganda ( selepas ini dirujuk sebagai permulaan pendakap berganda ) ialah alat Java untuk mencipta koleksi seperti senarai, set dan peta serentak dengan pengisytiharannya.
Permulaan pendakap berganda - 1
Apabila anda memerlukan senarai dengan elemen tetap, seperti senarai produk atau mata wang yang disokong, mengisytiharkan senarai pada masa yang sama dengan memulakannya meningkatkan kebolehbacaan kod. Inilah sebabnya mengapa permulaan pendakap berganda semakin popular, kerana tiada kaedah standard lain untuk mencipta koleksi dengan pengamulaan serentak dalam kod. Malangnya, tidak seperti bahasa pengaturcaraan lain, Java tidak menyokong koleksi literal. Disebabkan oleh pengehadan ini, mencipta unmodifiableList dengan walaupun sebilangan kecil elemen memaksa kami menulis banyak baris kod dalam bentuk panggilan berulang add()untuk menambah elemen yang dikehendaki dengan pembalut 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 ialah perihalan berlebihan yang tidak perlu yang boleh dipermudahkan. Mari kita isi senarai statik dengan cara yang mudah untuk kita, iaitu secara langsung dalam blok statik semasa pemulaan, yang mana Double braceinisialisasi akan membantu kita, membolehkan kita menulis segala-galanya dalam satu baris:
List<Integer> list = Collections.unmodifiableList(new ArrayList<Integer>() {{
        add(2);
        add(3);
        add(5);
}});
Begitu juga, Double bracepermulaan akan membantu kami mengisi nilai dan HashMap:
Map<Integer, String> intToString = new HashMap<Integer, String>(){{
         put(1, "one");
         put(2, "two");
         put(3, "three");
 }};
Semuanya kelihatan sangat elegan, tetapi ia mempunyai kelemahannya, yang menjadikan pengamulaan pendakap berganda sebagai anti-corak. Kita akan melihatnya dengan lebih lanjut dalam bab seterusnya.

Kebaikan dan keburukan permulaan pendakap berganda.

Doublepermulaan pendakap menggunakan penciptaan kelas dalaman tanpa nama . Apa yang pada mulanya tersembunyi di permukaan, bagaimanapun, Double bracepemulaan mencipta kelas dengan permulaan selanjutnya bagi contohnya setiap kali anda menggunakannya. Di samping itu, rujukan tersembunyi kepada kelas persendirian ini digunakan, yang boleh membawa kita kepada kemungkinan kebocoran memori. Anda juga tidak boleh menggunakan pengendali hantu untuk generik (pengendali berlian < >), kerana kami tidak boleh mengakses bahagian dalam kelas tanpa nama.
(Daripada penterjemah: Sekali lagi dengan lebih terperinci:
selepas yang pertama {, kelas tanpa nama dalaman dibuat, selepas yang kedua, {permulaan berlaku apabila mencipta contoh kelas, di mana kita mempunyai akses kepada medan dan kaedah luaran ( relatif kepada kelas tanpa nama).)
Kelebihan:
  1. Mengurangkan baris dalam kod
  2. Penciptaan dan permulaan dalam satu ungkapan.
Kekurangan:
  1. Membuat kelas tanpa nama disembunyikan daripada anda.
  2. Yang menyebabkan kami memerlukan kos tambahan untuk contoh setiap kali kami menggunakannya.
  3. Setiap kali rujukan tersembunyi kepadanya dibuat, yang mungkin menyebabkan kebocoran memori.
Keputusan: Disebabkan keburukan di atas dan kewujudan alternatif kepada pendakap berganda, pemulaan dilihat sebagai anti-corak dalam dunia Java. Selamatkan anak kucing itu

Alternatif kepada permulaan pendakap berganda dalam Java

Berita baiknya ialah terdapat cara lain untuk mencapai matlamat yang sama di Jawa. Kita boleh melaksanakan dalam satu baris kod penciptaan dan permulaan ArrayList menggunakan pembina Salin daripada kelas Koleksi seperti yang ditunjukkan di bawah:
List<Integer> list = Collections.unmodifiableList(new ArrayList<>(Arrays.asList(2, 3, 5)));
Arrays.asList()akan mengembalikan kepada kami senarai panjang tetap yang diserahkan kepada ArrayListpembina salinan. Perlu diingat perbezaan antara senarai panjang tetap yang dikembalikan daripada Arrays.asList()dan Collections.unmodifiableList(): anda tidak boleh menambah atau mengalih keluar elemen ArrayList- , tetapi anda boleh menukar elemen mengikut indeks menggunakan set(), yang anda tidak boleh lakukan dengan senarai yang dikembalikan oleh Collections.unmodifiableList(). Jika anda ingin mendapatkan senarai kecil, ini adalah cara terbaik, walaupun ia akan menjadi kurang telus untuk Setkoleksi lain, jadi anda perlu menciptanya Listsebelum mencipta Set-a. Tetapi ini masih lebih baik daripada permulaan pendakap berganda, kerana dalam kes ini kelas tanpa nama dalaman tambahan tidak dibuat setiap kali ia digunakan. Jika anda menjalankan Java 8 anda mempunyai kaedah alternatif lain. API Strim JDK 8 akan membantu anda membuat koleksi kecil dengan menggabungkan Stream Factorykaedah output ke dalam koleksi List:
List<String> list = Collections.unmodifiableList(Stream.of("abc", "bcd", "cde").collect(toList()));
Untuk Setanda boleh menggunakan Collectors.toSet()kaedah sebaliknya Collectors.toList()seperti di bawah:
Set<String> set = Collections.unmodifiableSet(Stream.of("abc", "bcd", "cde").collect(toSet()));
By the way, Stream collectkaedah tidak menjamin bahawa koleksi yang mereka hasilkan dilindungi daripada perubahan. Dalam Java 8, koleksi yang mereka kembalikan (seperti - ArrayList, HashSet, dan HashMap) adalah perkara biasa (kita boleh mengubahnya), tetapi fakta ini mungkin diperbetulkan dalam keluaran JDK akan datang. Itu sahaja buat masa ini mengenai Double bracepermulaan dalam Java. Templat ini boleh diterima untuk ujian dan tunjuk cara, tetapi tidak cukup baik untuk kegunaan pengeluaran. Disebabkan oleh kelemahan yang wujud, pemulaan pendakap berganda telah menjadi anti-corak pada hari ini, terutamanya memandangkan alternatif yang tersedia. Saya sendiri masih menggunakan pembinaan ini untuk memulakan peta statik dan itu sahaja. Kerana Listsaya lebih suka mencipta Collectionsdengan menggabungkan dengan mencipta Array.asListdalam pembinanya. Dan jika saya menggunakan Java 8 - reka bentuk menggunakan API Stream dan collect(). Artikel Berkaitan: Jika anda menikmati tutorial ini dan ingin mengetahui lebih lanjut tentang corak pengaturcaraan Java, prinsip dan amalan terbaik, anda juga mungkin ingin menyemak artikel lain di tapak kami . Bacaan Disyorkan: Jika anda ingin mengetahui lebih lanjut tentang corak dan amalan terbaik anda harus membaca Pengaturcaraan Berkesan oleh Joshua Bloch , tiada buku boleh menggantikannya. Dan jika anda sudah mahir dalam Java dan sedang mencari buku mengenai corak reka bentuk, gaya persembahan lucu yang menarik dan mudah dibaca, perhatikan "Kepala Didahulukan. Corak Rekaan" .
Daripada penterjemah: Saya sengaja memberikan pautan ke buku asal Bloch, kerana terjemahannya ke dalam bahasa Rusia tidak berjaya (contohnya, Builder = constructor).
Terjemahan artikel What is Double Brace Initialization in Java? Contoh Anti Corak (diterbitkan Oktober 2015).
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION