Kotlin Academy · Pelajaran

Fungsi Ekstensi: Sintaks dan Aturan Dispatch

Tulislah fungsi ekstensi dan pahami semantik dispatch statis.

Pelajaran 1 dari 413 langkah

Fungsi Ekstensi: Sintaks dan Aturan Dispatch adalah pelajaran Kotlin Academy gratis di CoddyKit. Ini adalah pelajaran 1 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.

Apa Itu Fungsi Ekstensi?

Fungsi ekstensi memungkinkan Anda menambahkan fungsi baru ke kelas yang sudah ada tanpa mengubahnya atau menggunakan pewarisan.

Sintaks Dasar Fungsi Ekstensi

Awali nama fungsi dengan tipe yang ingin Anda perluas, yang disebut 'tipe penerima'.
fun String.shout(): String = uppercase() + "!"
println("hello".shout())  // HELLO!
fun Int.isEven() = this % 2 == 0
println(4.isEven())  // true

this dalam Ekstensi

Di dalam fungsi ekstensi, 'this' merujuk pada objek penerima.
fun List<Int>.secondOrNull(): Int? {
    return if (size >= 2) this[1] else null
}
println(listOf(10, 20, 30).secondOrNull())  // 20
println(listOf(5).secondOrNull())           // null

Distribusi Statis: Ekstensi Tidak Menimpa

Fungsi ekstensi ditentukan secara statis saat kompilasi berdasarkan tipe yang dideklarasikan—fungsi tersebut BUKAN virtual.
open class Base
class Child : Base()
fun Base.greet() = "Hello from Base"
fun Child.greet() = "Hello from Child"

val obj: Base = Child()
println(obj.greet())  // "Hello from Base" (static dispatch!)

Ekstensi dibandingkan Fungsi Anggota

Jika sebuah kelas memiliki fungsi anggota dengan tanda tangan yang sama seperti fungsi ekstensi, fungsi anggota selalu dipilih.
class Greeter {
    fun hello() = "member hello"
}
fun Greeter.hello() = "extension hello"  // shadowed!
println(Greeter().hello())  // "member hello"

Ekstensi dengan Penerima Nullable

Anda dapat memperluas tipe nullable. Di dalamnya, tangani nilai null dengan pemeriksaan 'this == null'.
fun String?.orEmpty() = this ?: ""
fun Any?.toStringSafe() = this?.toString() ?: "null"
println(null.orEmpty())  // ""
println(42.toStringSafe())  // "42"

Visibilitas dan Lingkup

Ekstensi dapat berada di tingkat teratas (global), di dalam kelas (ekstensi anggota), atau di dalam berkas. Ekstensi mengikuti aturan visibilitas biasa.
// Top-level extension:
fun List<String>.joinUppercase() = joinToString { it.uppercase() }
// Private to file:
private fun String.clean() = trim().lowercase()

Ekstensi Objek Pendamping

Tambahkan ekstensi ke objek pendamping untuk memperluas ruang nama tingkat kelas.
class User(val name: String) {
    companion object
}
fun User.Companion.guest() = User("Guest")
val guest = User.guest()

Ekstensi pada Tipe Pustaka Standar

Perluas tipe apa pun—termasuk tipe bawaan.
fun Double.roundTo(decimals: Int): Double {
    val factor = Math.pow(10.0, decimals.toDouble())
    return Math.round(this * factor) / factor
}
println(3.14159.roundTo(2))  // 3.14

Mengatur Ekstensi

Kelompokkan ekstensi untuk suatu tipe dalam berkas khusus, misalnya StringExtensions.kt dan DateExtensions.kt.
// StringExtensions.kt
fun String.titleCase() = split(" ")
    .joinToString(" ") {
        it.replaceFirstChar { c -> c.uppercase() }
    }
println("hello world".titleCase())  // Hello World

Ekstensi Tidak Dapat Mengakses Anggota Privat

Ekstensi hanya dapat mengakses anggota publik dan internal—bukan anggota privat atau terlindungi.
class Secret {
    private val key = "hidden"
    val name = "public"
}
fun Secret.reveal() {
    println(name)  // OK
    // println(key)  // Error: key is private
}

Pemeriksaan Singkat

Jika fungsi anggota kelas dan fungsi ekstensi memiliki tanda tangan yang sama, fungsi mana yang dipanggil?

Ringkasan

Fungsi ekstensi menambahkan perilaku ke kelas apa pun tanpa modifikasi. Fungsi tersebut didistribusikan secara statis (tanpa penimpaan). Anggota lebih diutamakan daripada ekstensi. Gunakan penerima nullable untuk pembantu yang aman terhadap null. Berikutnya: properti ekstensi!
Gratis untuk memulai

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 “Fungsi Ekstensi: Sintaks dan Aturan Dispatch” gratis?

Ya — teks lengkap “Fungsi Ekstensi: Sintaks dan Aturan Dispatch” 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 “Fungsi Ekstensi: Sintaks dan Aturan Dispatch”?

Tulislah fungsi ekstensi dan pahami semantik dispatch statis. 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 1 dari 4.

Berapa lama pelajaran “Fungsi Ekstensi: Sintaks dan Aturan Dispatch” 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

  1. Fungsi Ekstensi: Sintaks dan Aturan Dispatch
  2. Properti Ekstensi dan Ekstensi Terhitung
  3. Ekstensi Terbatas dan Ekstensi Companion
  4. Ekstensi Praktis: Pembantu Context, View, dan String
← Kembali ke Kotlin Academy