Hai, saya seorang pemula di dunia Kotlin. Saya suka apa yang saya lihat sejauh ini dan mulai berpikir untuk mengubah beberapa perpustakaan kami yang kami gunakan dalam aplikasi kami dari Jawa ke Kotlin.
Perpustakaan ini penuh dengan Pojo dengan setter, getter dan kelas Builder. Sekarang saya telah mencari di Google apa cara terbaik untuk mengimplementasikan Builder di Kotlin tetapi tidak berhasil.
Pembaruan ke-2: Pertanyaannya adalah bagaimana menulis pola desain Builder untuk pojo sederhana dengan beberapa parameter di Kotlin? Kode di bawah ini adalah usaha saya dengan menulis kode java dan kemudian menggunakan eclipse-kotlin-plugin untuk mengkonversi ke Kotlin.
class Car private constructor(builder:Car.Builder) {
var model:String? = null
var year:Int = 0
init {
this.model = builder.model
this.year = builder.year
}
companion object Builder {
var model:String? = null
private set
var year:Int = 0
private set
fun model(model:String):Builder {
this.model = model
return this
}
fun year(year:Int):Builder {
this.year = year
return this
}
fun build():Car {
val car = Car(this)
return car
}
}
}
design-patterns
kotlin
Keyhan
sumber
sumber
model
danyear
bisa berubah? Apakah Anda mengubahnya setelahCar
penciptaan?Jawaban:
Pertama dan terutama, dalam banyak kasus Anda tidak perlu menggunakan pembangun di Kotlin karena kami memiliki argumen default dan bernama. Ini memungkinkan Anda untuk menulis
dan gunakan seperti ini:
Jika Anda benar-benar ingin menggunakan pembuat, berikut ini cara melakukannya:
Membuat Builder menjadi
companion object
tidak masuk akal karenaobject
s adalah lajang. Alih-alih mendeklarasikannya sebagai kelas bersarang (yang statis secara default di Kotlin).Pindahkan properti ke konstruktor sehingga objek juga dapat dipakai dengan cara biasa (jadikan konstruktor sebagai pribadi jika tidak seharusnya) dan gunakan konstruktor sekunder yang mengambil pembangun dan mendelegasikannya ke konstruktor utama. Kode akan terlihat sebagai berikut:
Pemakaian:
val car = Car.Builder().model("X").build()
Kode ini juga dapat dipersingkat dengan menggunakan DSL pembangun :
Pemakaian:
val car = Car.build { model = "X" }
Jika beberapa nilai diperlukan dan tidak memiliki nilai default, Anda harus meletakkannya di konstruktor pembangun dan juga dalam
build
metode yang baru saja kita tetapkan:Pemakaian:
val car = Car.build(required = "requiredValue") { model = "X" }
sumber
Car.Builder builder = new Car.Builder();
. Namun hanya versi pertama yang memiliki antarmuka yang lancar sehingga panggilan ke versi kedua dan ketiga tidak dapat dirantai.Salah satu pendekatan adalah melakukan sesuatu seperti berikut:
Sampel penggunaan:
sumber
Karena saya menggunakan perpustakaan Jackson untuk mem-parsing objek dari JSON, saya harus memiliki konstruktor kosong dan saya tidak bisa memiliki bidang opsional. Juga semua bidang harus bisa berubah. Maka saya bisa menggunakan sintaks yang bagus ini yang melakukan hal yang sama dengan pola Builder:
sumber
@JsonProperty
@JsonProperty
lagi, jika Anda mengkompilasi dengan-parameters
sakelar.Saya pribadi belum pernah melihat tukang bangunan di Kotlin, tapi mungkin hanya saya.
Semua validasi yang dibutuhkan terjadi di
init
blok:Di sini saya mengambil kebebasan untuk menebak bahwa Anda tidak benar-benar ingin
model
danyear
dapat berubah. Juga nilai-nilai default itu tampaknya tidak masuk akal, (terutamanull
untukname
) tetapi saya meninggalkannya untuk tujuan demonstrasi.Opini: Pola pembangun yang digunakan di Jawa sebagai sarana untuk hidup tanpa parameter bernama. Dalam bahasa dengan parameter bernama (seperti Kotlin atau Python) adalah praktik yang baik untuk memiliki konstruktor dengan daftar panjang (mungkin opsional) parameter.
sumber
@JvmOverloads
kotlinlang.org/docs/reference/…Saya telah melihat banyak contoh yang menyatakan kesenangan ekstra sebagai pembangun. Saya pribadi menyukai pendekatan ini. Simpan upaya untuk menulis pembangun.
Saya belum menemukan cara yang dapat memaksa beberapa bidang diinisialisasi dalam DSL seperti menunjukkan kesalahan alih-alih melempar pengecualian. Beri tahu saya jika ada yang tahu.
sumber
Untuk kelas sederhana Anda tidak perlu pembangun yang terpisah. Anda dapat menggunakan argumen konstruktor opsional seperti yang dijelaskan Kirill Rakhman.
Jika Anda memiliki kelas yang lebih kompleks maka Kotlin menyediakan cara untuk membuat Builder / DSL gaya Groovy:
Pembangun Tipe-Aman
Berikut ini sebuah contoh:
Contoh Github - Builder / Assembler
sumber
Orang saat ini harus memeriksa Pembangun Jenis-Aman Kotlin .
Menggunakan cara pembuatan objek tersebut akan terlihat seperti ini:
Contoh penggunaan 'dalam aksi' yang bagus adalah kerangka kerja vaadin-on-kotlin , yang menggunakan pembangun typesafe untuk mengumpulkan pandangan dan komponen .
sumber
Saya terlambat ke pesta. Saya juga mengalami dilema yang sama jika saya harus menggunakan pola Builder dalam proyek tersebut. Kemudian, setelah penelitian saya menyadari itu sama sekali tidak perlu karena Kotlin sudah memberikan argumen bernama dan argumen default.
Jika Anda benar-benar perlu menerapkan, jawaban Kirill Rakhman adalah jawaban yang solid tentang cara menerapkan dengan cara yang paling efektif. Hal lain yang mungkin bermanfaat bagi Anda adalah https://www.baeldung.com/kotlin-builder-pattern yang dapat Anda bandingkan dan kontras dengan Java dan Kotlin dalam penerapannya
sumber
Saya akan mengatakan pola dan implementasinya tetap sama di Kotlin. Anda kadang-kadang dapat melewatinya berkat nilai default, tetapi untuk pembuatan objek yang lebih rumit, pembangun masih merupakan alat yang berguna yang tidak dapat dihilangkan.
sumber
Anda dapat menggunakan parameter opsional di kotlin contoh:
kemudian
sumber
sumber
Saya menerapkan pola dasar Builder di Kotlin dengan kode berikut:
Dan akhirnya
Jawa:
Kotlin:
sumber
Saya sedang mengerjakan proyek Kotlin yang mengekspos API yang dikonsumsi oleh klien Java (yang tidak bisa mengambil keuntungan dari konstruksi bahasa Kotlin). Kami harus menambahkan pembangun agar dapat digunakan di Jawa, jadi saya membuat anotasi @Builder: https://github.com/ThinkingLogic/kotlin-builder-annotation - ini pada dasarnya merupakan pengganti anotasi Lombok @Builder untuk Kotlin.
sumber