Keterbatasan
Hal yang tidak dapat dilakukan kelas nilai
Keterbatasan adalah pelajaran Kotlin Academy gratis di CoddyKit. Ini adalah pelajaran 4 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Kotlin Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Kotlin Academy mencakup 4 pelajaran total.
Memahami Batasannya
Kelas nilai memang kuat, tetapi memiliki batasan. Memahami batasan tersebut membantu Anda memilih alat yang tepat dan menghindari kejutan.
Tepat Satu Properti
Kelas nilai membungkus satu nilai. Untuk mengelompokkan beberapa bidang, Anda memerlukan kelas biasa atau data class.
// @JvmInline value class Range(val lo: Int, val hi: Int) // not allowed
data class Range(val lo: Int, val hi: Int)
fun main() {
println(Range(1, 10))
}Tidak Ada Keadaan init Selain Nilai
Kelas nilai tidak dapat memiliki bidang pendukung selain properti konstruktor satu-satunya. Keadaan tambahan var dengan bidang pendukung tidak diizinkan.
@JvmInline
value class Counter(val value: Int) {
// val cached: Int = value * 2 // not allowed: extra backing field
val doubled: Int get() = value * 2 // computed is fine
}
fun main() {
println(Counter(3).doubled)
}Tidak Ada Pewarisan
Kelas nilai secara implisit bersifat final. Kelas ini tidak dapat memperluas kelas lain dan tidak dapat diperluas. Kelas nilai hanya dapat mengimplementasikan antarmuka.
interface Named { val label: String }
@JvmInline
value class Tag(val text: String) : Named {
override val label: String get() = text
}
fun main() {
println(Tag("urgent").label)
}Biaya Pembungkusan Kembali
Janji tanpa beban tambahan hilang ketika nilai digunakan sebagai tipe nullable, generik, atau antarmuka. Kompilator kemudian membungkusnya menjadi objek nyata.
@JvmInline
value class Id(val raw: Int)
fun main() {
val list: List<Id> = listOf(Id(1), Id(2)) // boxed inside the list
println(list.map { it.raw })
}Tidak Memiliki Identitas
Kelas nilai tidak memiliki identitas referensial yang stabil. Kesetaraan referensi dengan === tidak bermakna, dan kelas nilai tidak dapat digunakan ketika identitas objek penting, seperti pada kunci sinkronisasi.
@JvmInline
value class Code(val value: Int)
fun main() {
val a = Code(5)
val b = Code(5)
println(a == b) // structural equality works
}Tidak Dapat Menggunakan lateinit atau Delegasi
Anda tidak dapat menerapkan lateinit pada nilai yang mendasarinya, dan kelas nilai tidak mendukung delegasi properti pada bidang tunggalnya. Nilai tersebut harus ditetapkan di konstruktor.
@JvmInline
value class Slug(val value: String)
fun main() {
val s = Slug("hello-world") // must be provided up front
println(s.value)
}Pengubahan Nama JVM
Di JVM, fungsi yang menerima parameter kelas nilai mendapatkan nama yang diubah dalam kode bita untuk menghindari benturan. Hal ini mempersulit interoperabilitas dengan Java; pemanggil Java mungkin tidak dapat melihatnya dengan baik.
@JvmInline
value class Hz(val value: Int)
fun tune(freq: Hz) = freq.value
fun main() {
println(tune(Hz(440))) // simple from Kotlin; mangled from Java
}Bukan untuk Pembungkus Banyak Bidang
Jika Anda merasa memerlukan dua properti, kelas nilai adalah alat yang keliru. Gunakan data class dan terima alokasi tambahan sebagai imbalan atas struktur yang lebih kaya.
data class Coordinate(val lat: Double, val lng: Double)
fun main() {
println(Coordinate(41.0, 29.0))
}Rangkuman Keterbatasan
Kelas nilai tidak dapat:
- Menyimpan lebih dari satu properti
- Memiliki bidang pendukung tambahan atau
lateinit - Mewarisi dari kelas atau diwarisi oleh kelas
- Menyediakan identitas referensial
- Selalu menghindari pembungkusan
Memilih dengan Bijak
Gunakan kelas nilai untuk satu nilai yang divalidasi dan aman secara tipe. Gunakan kelas data untuk data yang dikelompokkan. Gunakan alias tipe untuk keterbacaan semata tanpa keamanan tambahan. Masing-masing memiliki kegunaannya.
Pemeriksaan Singkat
Uji pemahaman Anda tentang keterbatasan kelas nilai.
Rangkuman
Anda telah mempelajari keterbatasan kelas nilai:
- Satu properti, tanpa bidang pendukung tambahan
- Tidak ada pewarisan dan tidak ada identitas
- Pembungkusan kembali terjadi saat digunakan sebagai nullable, generik, atau antarmuka
- Pengubahan nama JVM mempersulit interoperabilitas dengan Java
Sesuaikan alat dengan kebutuhan.
Belajar Kotlin dengan tutor AI — gratis
Tulis dan jalankan kode asli di browser kamu, dapatkan bantuan instan dari tutor AI 24/7, dan lanjutkan di mana kamu tinggalkan di web atau aplikasi.
- Kursus
- 51
- Pelajaran
- 203
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Keterbatasan” gratis?
Ya — teks lengkap “Keterbatasan” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Kotlin Academy, upgrade ke CoddyKit PRO. Kursus Kotlin Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Keterbatasan”?
Hal yang tidak dapat dilakukan kelas nilai Kamu berlatih Kotlin Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai Kotlin Academy?
Tidak diperlukan pengalaman sebelumnya. Kotlin Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 4 dari 4.
Berapa lama pelajaran “Keterbatasan” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran Kotlin Academy ini?
Ya. Setiap pelajaran Kotlin Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Alias Tipe
- Kelas Nilai Inline
- Kasus Penggunaan
- Keterbatasan