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.0fromFahrenheit 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 privateOutput:
ada_l
nullcompanion 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: 2Kotlin 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()
}
}Tantangan
MudahLengkapi 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}")
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1class dan object
Bekerja dengan fileMendefinisikan classKonstruktor utamaBlok init dan validasiKonstruktor sekunderRingkasan: Kartu Perpustakaan2property dan Enkapsulasi
Accessor KustomModifier VisibilitasSetter Privatlazy dan lateinitRingkasan: Rekening Bank5Interface
Mendeklarasikan Interfacemethod DefaultBeberapa InterfaceInterface sebagai TipeUlasan: Metode Pembayaran11Proyek: Pengelolaan Perpustakaan
Buku dan AnggotaPeminjaman Buku3Objek dan Companion Object
Deklarasi ObjectCompanion ObjectKonstanta dengan constEkspresi ObjectUlasan: Loket TiketLatihan sendiri: Playground Kotlin