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 playersKonstanta 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
2Tingkat 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
}
}Tantangan
MudahLengkapi 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}")
}
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