Saya memiliki 10+ parameter dalam kelas data, saya ingin menginisialisasi kelas data dengan konstruktor kosong dan menetapkan nilai hanya untuk beberapa parameter menggunakan setter dan meneruskan objek ke server.
data class Activity(
var updated_on: String,
var tags: List<String>,
var description: String,
var user_id: List<Int>,
var status_id: Int,
var title: String,
var created_at: String,
var data: HashMap<*, *>,
var id: Int,
var counts: LinkedTreeMap<*, *>,
)
Pemakaian:
Sesuatu seperti ini akan mudah
val activity = Activity();
activity.title = "New Computer"
sendToServer(activity)
Tapi itu membutuhkan semua argumen untuk diteruskan saat membuat konstruktor. Bagaimana saya bisa menyederhanakan seperti di atas?
val activity = Activity(null,null,null,null,null,"New Computer",null,null,null,null);
sendToServer(activity)
copy
Anda membutuhkan instance kelas data. Untuk membuatnya, Anda perlu memanggil konstruktor - dan inilah masalahnya.emptyList
tidak akan berulang kali mengalokasikan memori. Ia mengembalikan singleton .Jika Anda memberikan nilai default ke semua bidang - konstruktor kosong dihasilkan secara otomatis oleh Kotlin.
dan Anda cukup menelepon:
sumber
class FeelComChatMessage (messageText: String = "", messageUser: String = "")
Bersamaan dengan jawaban @miensol, izinkan saya menambahkan beberapa detail:
Jika Anda menginginkan konstruktor kosong yang terlihat-Java menggunakan kelas data, Anda perlu mendefinisikannya secara eksplisit.
Menggunakan nilai default + specifier konstruktor cukup mudah:
Ini berarti bahwa dengan trik ini Anda sekarang dapat membuat cerita bersambung / deserialize objek ini dengan serializers Java standar (Jackson, Gson dll).
sumber
Jika Anda memberikan nilai default ke setiap parameter konstruktor utama:
dan dari kelas di mana instance Anda dapat menyebutnya tanpa argumen atau dengan argumen yang Anda miliki saat itu
sumber
Saya sarankan untuk memodifikasi konstruktor utama dan menambahkan nilai default ke setiap parameter:
Anda juga dapat membuat nilai nullable dengan menambahkan
?
dan kemudian Anda dapat mengasumsikannull
:Secara umum, ini adalah praktik yang baik untuk menghindari objek yang tidak dapat dibatalkan - tulis kode sedemikian rupa sehingga kita tidak perlu menggunakannya. Objek yang tidak dapat dibatalkan adalah salah satu kelebihan Kotlin dibandingkan dengan Jawa. Oleh karena itu, opsi pertama di atas lebih disukai .
Kedua opsi akan memberi Anda hasil yang diinginkan:
sumber
Konstruktor sekunder tidak kosong untuk kelas data di Kotlin:
Kosong konstruktor sekunder untuk kelas data di Kotlin:
sumber
Dari dokumentasi
sumber