Saya mencari untuk mengimplementasikan fungsionalitas dalam daftar objek seperti yang saya lakukan di C # menggunakan metode ekstensi.
Sesuatu seperti ini:
List<DataObject> list;
// ... List initialization.
list.getData(id);
Bagaimana saya melakukannya di Jawa?
java
extension-methods
Fabio Milheiro
sumber
sumber
Jawaban:
Java tidak mendukung metode ekstensi.
Sebagai gantinya, Anda dapat membuat metode statis biasa, atau menulis kelas Anda sendiri.
sumber
Metode penyuluhan bukan hanya metode statis dan bukan hanya kenyamanan sintaksis gula, pada kenyataannya mereka adalah alat yang sangat kuat. Hal utama yang ada adalah kemampuan untuk mengganti metode yang berbeda berdasarkan instantiasi parameter generik yang berbeda. Ini mirip dengan kelas tipe Haskell, dan pada kenyataannya, sepertinya mereka berada di C # untuk mendukung Monad C # (yaitu LINQ). Bahkan menjatuhkan sintaks LINQ, saya masih tidak tahu cara untuk mengimplementasikan antarmuka serupa di Jawa.
Dan saya rasa tidak mungkin untuk mengimplementasikannya di Jawa, karena semantik tipe generik dari parameter generik.
sumber
Project Lombok menyediakan anotasi
@ExtensionMethod
yang dapat digunakan untuk mencapai fungsionalitas yang Anda minta.sumber
java.lang.String
,. Demonstrasi: http://manifold.systems/images/ExtensionMethod.mp4Secara teknis C # Extension tidak memiliki padanan di Java. Tetapi jika Anda ingin mengimplementasikan fungsi-fungsi tersebut untuk kode yang lebih bersih dan pemeliharaan, Anda harus menggunakan kerangka kerja Manifold.
sumber
Bahasa XTend - yang merupakan set super Java, dan mengkompilasi ke kode sumber Java 1 - mendukung ini.
sumber
Manifold memberi Java metode ekstensi gaya C # dan beberapa fitur lainnya. Tidak seperti alat lain, Manifold tidak memiliki batasan dan tidak menderita masalah dengan generik, lambdas, IDE dll. Manifold menyediakan beberapa fitur lain seperti tipe kustom gaya-F , antarmuka struktural gaya-TypeScript , dan tipe ekspansi gaya Javascript .
Selain itu, IntelliJ menyediakan dukungan komprehensif untuk Manifold melalui plugin Manifold .
Manifold adalah proyek sumber terbuka yang tersedia di github .
sumber
Pilihan lain adalah dengan menggunakan kelas ForwardingXXX dari perpustakaan google-jambu.
sumber
Java tidak memiliki fitur seperti itu. Alih-alih, Anda bisa membuat subkelas reguler dari implementasi daftar atau membuat kelas dalam anonim:
Masalahnya adalah memanggil metode ini. Anda dapat melakukannya "di tempat":
sumber
Sepertinya ada beberapa kemungkinan kecil bahwa Metode Defender (metode standar yaitu) mungkin membuatnya menjadi Java 8. Namun, sejauh yang saya memahami mereka, mereka hanya memungkinkan penulis dari
interface
surut memperpanjang, tidak pengguna sewenang-wenang.Metode Defender + Injeksi Antarmuka akan dapat sepenuhnya menerapkan metode ekstensi gaya C #, tetapi AFAICS, Antarmuka Antarmuka bahkan belum ada di peta jalan Java 8.
sumber
Agak terlambat ke pesta tentang pertanyaan ini, tetapi kalau-kalau ada yang merasa berguna saya baru saja membuat subkelas:
sumber
Kita dapat mensimulasikan implementasi metode ekstensi C # di Java dengan menggunakan implementasi metode default yang tersedia sejak Java 8. Kita mulai dengan mendefinisikan antarmuka yang akan memungkinkan kita untuk mengakses objek dukungan melalui metode base (), seperti:
Kami mengembalikan nol karena antarmuka tidak dapat memiliki keadaan, tetapi ini harus diperbaiki nanti melalui proxy.
Pengembang ekstensi harus memperluas antarmuka ini dengan antarmuka baru yang berisi metode ekstensi. Katakanlah kita ingin menambahkan konsumen forEach pada antarmuka Daftar:
Karena kami memperluas antarmuka Ekstensi, kami dapat memanggil metode base () di dalam metode ekstensi kami untuk mengakses objek dukungan yang kami lampirkan.
Antarmuka Ekstensi harus memiliki metode pabrik yang akan membuat ekstensi objek dukungan yang diberikan:
Kami membuat proksi yang mengimplementasikan antarmuka ekstensi dan semua antarmuka yang diterapkan oleh jenis objek dukungan. Penangan doa yang diberikan kepada proxy akan mengirimkan semua panggilan ke objek dukungan, kecuali untuk metode "basis", yang harus mengembalikan objek dukungan, jika tidak, implementasi defaultnya adalah mengembalikan nol:
Kemudian, kita bisa menggunakan metode Extension.create () untuk melampirkan antarmuka yang berisi metode ekstensi ke objek dukungan. Hasilnya adalah sebuah objek yang dapat dilemparkan ke antarmuka ekstensi dimana kita masih dapat mengakses objek dukungan yang memanggil metode base (). Setelah referensi dilemparkan ke antarmuka ekstensi, kita sekarang dapat memanggil metode ekstensi dengan aman yang dapat memiliki akses ke objek dukungan, sehingga sekarang kita dapat melampirkan metode baru ke objek yang ada, tetapi tidak dengan jenis definisi:
Jadi, ini adalah cara kita dapat mensimulasikan kemampuan untuk memperluas objek di Jawa dengan menambahkan kontrak baru kepada mereka, yang memungkinkan kita untuk memanggil metode tambahan pada objek yang diberikan.
Di bawah ini Anda dapat menemukan kode antarmuka Ekstensi:
sumber
Seseorang dapat menggunakan pola desain berorientasi objek dekorator . Contoh dari pola ini yang digunakan di pustaka standar Java adalah DataOutputStream .
Berikut beberapa kode untuk menambah fungsionalitas Daftar:
PS Saya penggemar berat Kotlin . Ini memiliki metode ekstensi dan juga berjalan di JVM.
sumber
Anda dapat membuat metode ekstensi / pembantu C # like dengan (RE) mengimplementasikan antarmuka Collections dan menambahkan- contoh untuk Java Collection:
sumber
Java
8 sekarang mendukung metode standar , yang mirip denganC#
metode ekstensi.sumber