Menu
CoddyTech

Konstanta dengan const

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

const val mendeklarasikan konstanta saat kompilasi: nilai yang tetap saat program dikompilasi. Deklarasi ini boleh berada di tingkat teratas file dan di dalam object atau companion object, dan hanya boleh digunakan untuk tipe dasar seperti Int, Double, dan Boolean, serta untuk String:

const val MAX_PLAYERS = 4

class Lobby {
    val players = mutableListOf<String>()

    fun canStart() = players.size in MIN_PLAYERS..MAX_PLAYERS

    companion object {
        const val MIN_PLAYERS = 2
    }
}

Di dalam main:

val lobby = Lobby()
lobby.players += listOf("ada", "bo")
println(lobby.canStart())
println("${Lobby.MIN_PLAYERS}-$MAX_PLAYERS players")

Keluaran:

true
2-4 players

Konstanta diberi nama dengan UPPER_SNAKE_CASE. const lebih ketat daripada val: nilainya harus diketahui tanpa menjalankan kode apa pun, jadi pemanggilan fungsi atau list tidak diizinkan. val dalam object juga dibagikan dan hanya-baca, serta menerima nilai apa pun:

const val GREETING = "Hello"                  // literal String
const val TIMEOUT_MS = 30 * 1000              // dihitung dari literal
// const val START = System.nanoTime()        // error: bukan konstanta
// const val DAYS = listOf("Mon", "Tue")      // error: hanya tipe dasar dan String
object Defaults {
    val DAYS = listOf("Mon", "Tue")           // val bersama yang hanya bisa dibaca
}

Companion object juga dapat menyimpan state mutable bersama. Setiap instance membaca dan mengubah property yang sama, sehingga cocok untuk penghitung dan cache. Class ini menyimpan satu instance untuk setiap nama, jadi permintaan yang dilakukan dua kali akan mengembalikan object yang sama (=== memeriksa apakah dua referensi menunjuk ke satu object):

class Tile private constructor(val name: String) {
    companion object {
        private val cache = mutableMapOf<String, Tile>()
        val created: Int
            get() = cache.size

        fun of(name: String) = cache.getOrPut(name) { Tile(name) }
    }
}

Di dalam main:

val a = Tile.of("grass")
val b = Tile.of("grass")
Tile.of("water")
println(a === b)
println(Tile.created)

Output:

true
2

Tingkat atas atau companion? Konstanta atau fungsi tingkat atas menjadi milik filenya dan digunakan dengan nama polosnya di setiap file dalam package. Letakkan konstanta dalam companion jika konstanta itu hanya berkaitan dengan satu class: pemanggil menulis Lobby.MIN_PLAYERS, yang menunjukkan dari mana nilai itu berasal, dan private const val tetap berada di dalam class tersebut.

// Limits.kt
const val MAX_UPLOAD_MB = 25                 // digunakan di mana-mana sebagai MAX_UPLOAD_MB

// Lobby.kt
class Lobby {
    companion object {
        const val MIN_PLAYERS = 2            // digunakan sebagai Lobby.MIN_PLAYERS
        private const val ROOM_PREFIX = "L-" // hanya di dalam Lobby
    }
}
challenge icon

Tantangan

Mudah

Lengkapi class Order(val item: String, val qty: Int). Companion object-nya menyimpan konstanta MAX_QTY = 10 dan PREFIX = "ORD", penghitung privat untuk nomor pesanan berikutnya, total bersama hanya-baca totalItems, dan count terhitung untuk jumlah pesanan yang dibuat. Blok init mengharuskan jumlah antara 1 dan MAX_QTY dengan pesan quantity must be 1-10 (dibuat dari konstanta), lalu memberi pesanan itu id ORD-001, ORD-002, ... dan menambahkan jumlahnya ke totalItems. label() mengembalikan ORD-001 tea x2.

Kode yang disediakan mencetak max per order: 10, lalu membaca baris tea 2 dan mencetak label atau pesan error, kemudian mencetak orders: 2, items: 5. Pesanan yang ditolak tidak menggunakan nomor.

Tulis kodemu di Order.kt. Main.kt berisi kode input/output yang disediakan dan tidak boleh diedit.

Coba sendiri

fun main() {
    // Kode input/output yang disediakan: biarkan apa adanya
    val input = generateSequence(::readLine).toList()
    println("max per order: ${Order.MAX_QTY}")
    for (line in input) {
        val (item, qty) = line.split(" ")
        try {
            println(Order(item, qty.toInt()).label())
        } catch (e: IllegalArgumentException) {
            println(e.message)
        }
    }
    println("orders: ${Order.count}, items: ${Order.totalItems}")
}
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