Ekstensi Terbatas dan Ekstensi Companion
Batasi visibilitas ekstensi dan tambahkan ekstensi ke companion object.
Ekstensi Terbatas dan Ekstensi Companion adalah pelajaran Kotlin Academy gratis di CoddyKit. Ini adalah pelajaran 3 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.
Mengapa Menggunakan Ekstensi dengan Lingkup?
Secara default, ekstensi terlihat di mana pun ekstensi tersebut diimpor. Pembatasan lingkup membatasi visibilitas ke kelas, berkas, atau konteks tertentu—mengurangi polusi ruang nama dan meningkatkan kemudahan penemuan.
Ekstensi Privat Tingkat Berkas
Tandai fungsi ekstensi sebagai private di tingkat berkas agar hanya berlaku di berkas tersebut.
private fun String.shout() = uppercase() + "!"
fun main() {
println("hello".shout()) // HELLO!
}Visibilitas Internal
Gunakan internal untuk membatasi ekstensi ke modul saat ini—cocok untuk bagian internal pustaka yang tidak ditujukan bagi penggunaan eksternal.
internal fun List<Int>.sumIfPositive(): Int = filter { it > 0 }.sum()
fun main() {
println(listOf(-1, 2, 3, -4).sumIfPositive()) // 5
}Fungsi Ekstensi Anggota
Deklarasikan ekstensi di dalam kelas agar ekstensi hanya dapat digunakan saat instans kelas tersebut berada dalam lingkup. Ekstensi ini memiliki dua penerima: penerima distribusi (kelas) dan penerima ekstensi (target).
class StringHelper(val prefix: String) {
fun String.withPrefix() = prefix + this
fun build(): String = "world".withPrefix() // calls extension via instance
}
fun main() {
println(StringHelper("hello ").build()) // hello world
}Visibilitas Ekstensi Anggota
Ekstensi anggota tidak dapat diakses dari luar kelas distribusi. Ini berguna untuk enkapsulasi.
class Repo {
fun List<Int>.allPositive() = all { it > 0 }
fun check(xs: List<Int>) = xs.allPositive()
}
fun main() {
val r = Repo()
println(r.check(listOf(1, 2, 3))) // true
// listOf(1).allPositive() // ERROR — no access
}Ekstensi pada Objek Pendamping
Tambahkan ekstensi ke objek pendamping suatu kelas. Bagi pemanggil, ekstensi ini tampak seperti metode statis, tetapi berada di luar kelas.
class Greeter {
companion object
}
fun Greeter.Companion.morning() = "Good morning!"
fun main() {
println(Greeter.morning())
}Mengapa Ekstensi Pendamping?
Berguna untuk menambahkan metode pembuat atau fungsi pembantu dari luar kelas asli—tanpa memodifikasinya.
class User(val name: String) {
companion object
}
fun User.Companion.guest() = User("Guest")
fun User.Companion.system() = User("System")
fun main() {
println(User.guest().name)
println(User.system().name)
}Objek Pendamping Wajib Ada
Sebuah kelas harus mendeklarasikan objek pendamping (meskipun kosong) agar ekstensi pendamping dapat ditempelkan. Jika tidak, target ekstensi tidak ada.
class Box {
companion object // required, even if empty
}
fun Box.Companion.create(): Box = Box()
fun main() {
println(Box.create())
}Ekstensi dengan Lingkup melalui Impor
Anda dapat membatasi penggunaan ekstensi dengan mengimpornya hanya di berkas tertentu. Berkas yang tidak mengimpornya tidak dapat melihat ekstensi tersebut.
// File A:
// fun String.shout() = uppercase()
// File B imports:
// import com.example.shout
// Only File B can call shout()
fun String.shout() = uppercase() + "!"
fun main() { println("hi".shout()) }Fungsi Ekstensi melalui Fungsi Lingkup
Gunakan with atau apply untuk sementara memasukkan objek ke dalam lingkup agar dapat digunakan oleh ekstensi.
class StringTools {
fun String.greet() = "Hello, $this!"
fun process(name: String) = with(this) {
name.greet()
}
}
fun main() {
println(StringTools().process("Ada"))
}Properti Ekstensi pada Companion
Ekstensi Companion juga dapat berupa properti—tambahkan konstanta bernama dari luar kelas.
class HttpStatus {
companion object
}
val HttpStatus.Companion.OK_CODE: Int get() = 200
val HttpStatus.Companion.NOT_FOUND: Int get() = 404
fun main() {
println(HttpStatus.OK_CODE)
println(HttpStatus.NOT_FOUND)
}Praktik Terbaik
Gunakan private untuk pembantu yang bersifat lokal pada berkas, internal untuk API khusus modul, ekstensi anggota untuk enkapsulasi, dan ekstensi Companion untuk menambahkan pembantu seperti pabrik dari luar.
class StringUtils {
companion object
}
fun StringUtils.Companion.isAlpha(s: String) = s.all { it.isLetter() }
fun main() {
println(StringUtils.isAlpha("hello"))
println(StringUtils.isAlpha("hi5"))
}Pemeriksaan Cepat
Apa yang diperlukan pada sebuah kelas agar Anda dapat menambahkan ekstensi Companion ke dalamnya dari luar?
Ringkasan
Batasi cakupan ekstensi dengan private, internal, atau sebagai ekstensi anggota di dalam kelas. Tambahkan ekstensi Companion (fungsi atau properti) dari luar dengan mengaitkannya ke objek Companion yang dideklarasikan oleh kelas. Cara ini mengurangi pencemaran ruang nama sekaligus menjaga kode tetap modular.
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 “Ekstensi Terbatas dan Ekstensi Companion” gratis?
Ya — teks lengkap “Ekstensi Terbatas dan Ekstensi Companion” 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 “Ekstensi Terbatas dan Ekstensi Companion”?
Batasi visibilitas ekstensi dan tambahkan ekstensi ke companion object. 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 3 dari 4.
Berapa lama pelajaran “Ekstensi Terbatas dan Ekstensi Companion” 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
- Fungsi Ekstensi: Sintaks dan Aturan Dispatch
- Properti Ekstensi dan Ekstensi Terhitung
- Ekstensi Terbatas dan Ekstensi Companion
- Ekstensi Praktis: Pembantu Context, View, dan String