Kaedah lanjutan ialah keupayaan untuk "menambah" kaedah terus kepada jenis sedia ada tanpa mencipta yang baharu? . jenis terbitan, susun semula atau ubah suai jenis sedia ada. Apabila memanggil kaedah sambungan, tidak ada perbezaan yang jelas berbanding dengan memanggil kaedah yang sebenarnya ditakrifkan dalam jenis tersebut.
Mengapa kaedah sambungan diperlukan
Pertimbangkan untuk melaksanakan fungsi berikut: selepas mengeluarkan rentetan yang mengandungi berbilang ID produk daripada Redis (setiap ID produk dipisahkan dengan koma), mula-mula bandingkan ID produk Alih keluar pendua (dan kekalkan susunan elemen), dan akhirnya gunakan koma untuk menyambungkan ID produk.
Anggap bahawa kaedah sambungan boleh dilaksanakan di Java, dan kami menambah kaedah sambungan keList untuk tatasusunan (tukar tatasusunan menjadi List) , tambah kaedah sambungan kepadaSet untuk Senarai (menukar Senarai menjadi LinkedHashSet), dan tambah kaedah sambungan join untuk Koleksi (untuk menyambungkan bentuk rentetan elemen dalam koleksi menggunakan penyambung yang diberikan), maka kami akan dapat menulis kod seperti ini:
Saya percaya anda sudah mempunyai jawapan mengapa kaedah sambungan diperlukan pada ketika ini:
boleh terus meningkatkan perpustakaan kelas sedia ada dan bukannya menggunakan kelas alat
Gunakan kelas alat untuk menulis kod dengan lebih lancar dan selesa menggunakan kaedah jenis itu sendiri
Kod lebih mudah dibaca kerana ia adalah panggilan berantai dan bukannya menggunakan anak patung bersarang kaedah statik
Mari kita tanya dahulu tentang ChatGPT yang popular baru-baru ini:
Pandangan ChatGPT ialah di Java, kaedah sambungan disediakan melalui kelas alat Dilaksanakan dengan kaedah statik. Jadi seterusnya saya akan memperkenalkan teknologi hitam serba baharu:
Manifold
Manifold dan Lombok berfungsi dengan cara yang sama, kedua-duanya disusun melalui pemproses anotasi yang diproses apabila . Untuk menggunakan Manifold dengan berkesan, anda perlu memasang pemalam Manifold IDEA
dalam IDEA dan kemudian tambah anotasiProcessorPaths pada pemalam-pengkompil maven pom projek:
Jika anda menggunakan Lombok dalam projek anda, Lombok perlu ditambahkan ke annotationProcessorPaths:
Dalam JDK, kaedah split String menggunakan rentetan sebagai parameter, iaitu, String[] split (String). Sekarang mari kita tambahkan kaedah sambungan String[] split(char) ke String: Split mengikut aksara yang diberikan.
Tulis kaedah sambungan berdasarkan Manifold:
Anda boleh menemui kaedah statik yang pada asasnya merupakan kelas alat, tetapi terdapat beberapa keperluan:
Kelas alat perlu menggunakan @Extension Manifold anotasi
Dalam kaedah statik, parameter jenis sasaran perlu diberi anotasi dengan @This
Nama pakej kelas alat perlu diakhiri dengan sambungan. Jenis sasaran nama kelas yang layak sepenuhnya
——Pelajar yang telah menggunakan C# mungkin akan tersenyum secara sedar Ini adalah kaedah lanjutan C# yang ditiru.
Mengenai perkara 3, sebab keperluan ini ialah Manifold berharap untuk mencari kaedah sambungan dalam projek dengan cepat, mengelakkan pengimbasan anotasi semua kelas dalam projek dan meningkatkan kecekapan pemprosesan.
mempunyai keupayaan untuk melanjutkan kaedah, kini kita boleh memanggilnya seperti ini:
Amazing! Dan anda boleh mendapati bahawa System.out.println(numStrs.toString()) sebenarnya mencetak bentuk rentetan objek tatasusunan - bukan alamat objek tatasusunan. Semak imbas App.class yang dinyahkompilasi dan perhatikan bahawa panggilan kaedah sambungan telah digantikan dengan panggilan kaedah statik
dan kaedah toString tatasusunan menggunakan Manifold untuk mentakrif tatasusunan. Kaedah sambungan ManArrayExt.toString(@This Object array):
[Ljava.lang.String;@511d50c0 Apa kejadahnya, Selamat tinggal, tidak akan berjumpa lagi~
Oleh kerana panggilan kaedah sambungan digantikan dengan panggilan kaedah statik pada masa penyusunan, menggunakan kaedah sambungan Manifold, tiada masalah walaupun objek kaedah panggilan adalah batal, kerana kod yang diproses melepasi null sebagai parameter kepada statik yang sepadan kaedah. Contohnya, apabila melanjutkan Koleksi:
dan kemudian memanggil:
java.lang.NullPointerException, Selamat tinggal, tidak akan berjumpa lagi~
Kami melihat List ditulis seperti ini: @Self digunakan untuk menunjukkan jenis nilai beranotasi jika ia adalah @Self, iaitu @Self(false), yang mewakili nilai beranotasi. Nilai adalah jenis yang sama dengan nilai anotasi @Ini (benar) menunjukkan jenis elemen dalam tatasusunan.
Untuk tatasusunan objek, kita dapat melihat bahawa kaedah toList mengembalikan Senarai yang sepadan (T ialah jenis elemen tatasusunan):
Tetapi jika ia tatasusunan Jenis primitif, nilai pulangan yang ditunjukkan oleh IDEA ialah:
Tetapi saya menggunakan Java, bagaimana boleh memadam generik kaedah mempunyai fungsi yang hebat seperti Senarai - Jadi anda boleh hanya gunakan jenis asli untuk menerima nilai pulangan ini:)
—— Harapkan Projek Valhalla akan dikeluarkan tidak lama lagi.
Kami sering melihat dalam pelbagai projek bahawa setiap orang mula-mula membungkus objek ke dalam Pilihan, dan kemudian melakukan penapisan, peta, dsb. Melalui pemetaan jenis @Self, anda boleh menambah kaedah yang sangat praktikal pada Objek:
Kemudian mana-mana objek akan mempunyai kaedah asOpt().
Berbanding dengan pembungkusan luar biasa yang perlu dilakukan sebelum ini:
Anda kini boleh menggunakan Pilihan secara semula jadi:
Sudah tentu, Object ialah kelas induk bagi semua kelas, jadi Anda masih perlu berfikir dengan teliti sama ada sesuai untuk melakukannya.
Kita semua tahu bahawa Java9 menambahkan kaedah kilang pada koleksi:
Bukankah ia menggoda? Kerana jika anda tidak menggunakan Java 9 dan ke atas (Java 8: tunjukkan saya kad ID anda), anda perlu menggunakan perpustakaan seperti Guava - namun, ImmutableList.of tidak sebaik List.of yang digunakan Ia datang secara semula jadi .
Tidak mengapa, Manifold berkata: "Tidak mengapa, saya akan mengambil tindakan". Memperluaskan kaedah statik berdasarkan Manifold ialah menambah @Extension kepada kaedah statik kelas lanjutan:
Kemudian anda boleh menipu diri anda untuk menggunakan versi selepas Java8 - anda boleh melakukan apa sahaja yang anda mahu, saya menggunakan Java8.
BTW, kerana Object ialah kelas induk bagi semua kelas, jika anda menambah kaedah sambungan statik pada Object, ini bermakna anda boleh terus mengakses kaedah statik ini di mana-mana sahaja tanpa perlu mengimport - Tahniah Anda, buka kunci "fungsi teratas".
Atas ialah kandungan terperinci Apakah kaedah sambungan ciri Java yang tiada. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!