Menu
CoddyTech

Companion Object

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Kotlin di Coddy. Pelajaran 13 dari 57.

Beberapa anggota dimiliki oleh class secara keseluruhan, bukan oleh satu instance. Kotlin menempatkannya dalam companion object di dalam class, lalu kamu memanggilnya melalui nama class:

class Temperature(val celsius: Double) {
    companion object {
        fun fromFahrenheit(f: Double) = Temperature((f - 32) * 5 / 9)
    }
}

Di dalam main:

val boiling = Temperature.fromFahrenheit(212.0)
println(boiling.celsius)

Output:

100.0

fromFahrenheit adalah fungsi factory: fungsi yang membuat instance. Berbeda dari constructor, fungsi ini memiliki nama yang deskriptif dan dapat mengembalikan null alih-alih object. Dengan private constructor, fungsi factory menjadi satu-satunya cara untuk membuat instance, sehingga fungsi ini dapat memeriksa dan membersihkan input terlebih dahulu:

class Username private constructor(val text: String) {
    companion object {
        fun of(raw: String): Username? {
            val clean = raw.trim().lowercase()
            return if (clean.length in 3..12) Username(clean) else null
        }
    }
}

Di dalam main:

println(Username.of("  Ada_L ")?.text)
println(Username.of("x")?.text)
// Username("x")   // error: konstruktornya private

Output:

ada_l
null

companion object dimiliki oleh class, jadi companion object dapat memanggil constructor privat, dan kode milik class itu sendiri menggunakan member companion tanpa prefiks. Di sini, setiap tiket mengambil nomor berikutnya dari satu counter yang digunakan bersama oleh semua tiket:

class Ticket(val holder: String) {
    val number = nextNumber++

    companion object {
        private var nextNumber = 1
        val issued: Int
            get() = nextNumber - 1
    }
}

Di dalam main:

val a = Ticket("Ada")
val b = Ticket("Bo")
println("${a.holder} #${a.number}, ${b.holder} #${b.number}")
println("issued: ${Ticket.issued}")

Output:

Ada #1, Bo #2
issued: 2

Kotlin tidak memiliki kata kunci static. Member companion menjalankan peran tersebut: satu salinan untuk seluruh class, yang diakses sebagai ClassName.member. Seperti object lainnya, companion dibuat satu kali, saat class pertama kali digunakan. Masukkan ke dalamnya hal-hal yang tidak bergantung pada satu instance, seperti factory dan penghitung bersama; semua hal yang membaca data instance tetap menjadi member biasa.

class User private constructor(val name: String) {
    fun greet() = "hi $name"             // memerlukan instance: user.greet()

    companion object {
        fun guest() = User("guest")      // milik class: User.guest()
    }
}
challenge icon

Tantangan

Mudah

Lengkapi class Coupon. Constructornya bersifat private, jadi kupon dibuat oleh factory Coupon.create(code, percent) di companion object. Factory ini mengembalikan null kecuali kodenya terdiri dari 4 hingga 10 karakter berupa huruf besar dan angka, serta persentasenya antara 1 dan 90. Companion object juga menghitung jumlah kupon yang dibuatnya dalam created, yang dapat dibaca oleh kode di luar tetapi tidak dapat diubah. apply(price) mengembalikan harga setelah dikurangi diskon, dibulatkan ke bawah (price * (100 - percent) / 100).

Kode yang disediakan membaca baris SAVE10 10 200 (kode, persentase, harga). Kode ini mencetak SAVE10: 180 atau invalid coupon SAVE10, lalu mencetak created: beserta jumlahnya.

Tuliskan kodemu di Coupon.kt. Main.kt berisi kode input/output yang disediakan dan tidak dapat diedit.

Coba sendiri

fun main() {
    // Kode input/output yang disediakan: biarkan tetap seperti ini
    val input = generateSequence(::readLine).toList()
    for (line in input) {
        val (code, percent, price) = line.split(" ")
        val coupon = Coupon.create(code, percent.toInt())
        if (coupon == null) println("invalid coupon $code") else println("${coupon.code}: ${coupon.apply(price.toInt())}")
    }
    println("created: ${Coupon.created}")
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Playground Kotlin