Menu
CoddyTech

Deklarasi Object

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

object Name { ... } mendeklarasikan sebuah class dan satu-satunya instance-nya sekaligus. Kamu menggunakan object dengan namanya, tidak ada constructor yang perlu dipanggil:

object AppConfig {
    var theme = "light"
    val version = "1.4"

    fun describe() = "v$version, $theme theme"
}

Di dalam main:

println(AppConfig.describe())
AppConfig.theme = "dark"
println(AppConfig.describe())

Output:

v1.4, light theme
v1.4, dark theme

Hanya ada satu instance, sehingga setiap bagian program yang menggunakan object tersebut membaca dan mengubah state yang sama. Object dibuat saat pertama kali digunakan, seperti yang ditunjukkan oleh blok init di bawah ini:

object Visits {
    var count = 0
        private set

    init { println("Visits created") }

    fun record() { count++ }
}

fun home() = Visits.record()
fun about() { Visits.record(); Visits.record() }

Di dalam main:

println("start")
home()
about()
println(Visits.count)

Output:

start
Visits created
3

Sebuah object tidak memiliki konstruktor karena tidak ada yang membuatnya. Property-nya mendapatkan nilainya melalui deklarasi atau di init. Selain itu, isinya seperti isi class biasa: status privat, helper privat, dan method publik:

object IdGenerator {
    private var next = 1

    fun newId(prefix: String) = "$prefix-${pad(next++)}"

    private fun pad(n: Int) = n.toString().padStart(3, '0')
}

Di dalam main:

println(IdGenerator.newId("user"))
println(IdGenerator.newId("order"))

Output:

user-001
order-002

Gunakan object untuk sesuatu yang jumlahnya tepat satu dalam program: registry, konfigurasi, atau sekelompok fungsi pembantu. Object adalah status global yang dapat diubah oleh file mana pun, jadi jadikan setter-nya privat dan biarkan method-nya memeriksa setiap perubahan.

object Units {
    fun kmToMiles(km: Double) = km * 0.621371
}
Units.kmToMiles(10.0)        // dipanggil melalui namanya
// val u = Units()           // error: object tidak memiliki konstruktor
challenge icon

Tantangan

Mudah

Lengkapi object Leaderboard. Object ini menyimpan poin setiap pemain dalam map privat. add(player, points) menambahkan poin, top() mengembalikan pemain teratas sebagai ada 6 (jika poinnya sama, nama yang lebih dulu menurut urutan alfabet) atau empty jika tidak ada yang memiliki poin, reset() menghapus semua pemain, dan property players adalah jumlah pemain.

Fungsi pembantu recordWin dan recordDraw dalam Functions.kt sudah disediakan: fungsi-fungsi ini menggunakan Leaderboard dari file lain. Kode yang disediakan membaca perintah win ada, draw ada bo, top atau reset, mencetak top() untuk setiap top, lalu mencetak players: beserta jumlah pemain.

Tulis kodemu di Leaderboard.kt dan Functions.kt. Main.kt berisi kode input/output yang disediakan dan tidak dapat diedit.

Coba sendiri

fun main() {
    // Kode input/output yang disediakan: biarkan apa adanya
    val input = generateSequence(::readLine).toList()
    for (cmd in input) {
        val p = cmd.split(" ")
        when (p[0]) {
            "win" -> recordWin(p[1])
            "draw" -> recordDraw(p[1], p[2])
            "reset" -> Leaderboard.reset()
            else -> println(Leaderboard.top())
        }
    }
    println("players: ${Leaderboard.players}")
}
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