Enum class
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Kotlin di Coddy. Pelajaran 33 dari 57.
enum class mendeklarasikan tipe dengan sekumpulan nilai tetap, yaitu konstanta. Setiap konstanta adalah object dari enum dengan name dan ordinal, posisinya dimulai dari 0. entries mencantumkan konstanta dalam urutan:
enum class Direction { NORTH, EAST, SOUTH, WEST }Di dalam main:
val d = Direction.EAST
println(d)
println(d.ordinal)
println(Direction.entries)Output:
EAST
1
[NORTH, EAST, SOUTH, WEST]Konstanta enum dapat memiliki properti yang diteruskan ke konstruktor enum, dan enum dapat mendeklarasikan method. Titik koma mengakhiri daftar konstanta sebelum anggota:
enum class Coin(val cents: Int) {
PENNY(1), NICKEL(5), DIME(10), QUARTER(25);
fun label() = "${name.lowercase()} ($cents c)"
}Di dalam main:
println(Coin.DIME.label())
println(Coin.entries.sumOf { it.cents })Output:
dime (10 c)
41Sebuah when pada enum yang mencantumkan setiap konstanta tidak memerlukan else, dan compiler melaporkan konstanta yang tidak dicantumkan. valueOf("SOUTH") mencari konstanta berdasarkan nama persisnya dan melempar error jika nama tidak dikenal, jadi input biasanya dicocokkan dengan entries.find:
enum class Direction { NORTH, EAST, SOUTH, WEST }
fun turnRight(d: Direction) = when (d) {
Direction.NORTH -> Direction.EAST
Direction.EAST -> Direction.SOUTH
Direction.SOUTH -> Direction.WEST
Direction.WEST -> Direction.NORTH
}
fun parse(text: String) = Direction.entries.find { it.name == text.uppercase() }Di dalam main:
println(turnRight(Direction.valueOf("SOUTH")))
println(parse("north"))
println(parse("up"))Output:
WEST
NORTH
nullSebuah konstanta dapat memiliki body sendiri dan meng-override method di dalamnya. Mendeklarasikan method abstract di enum mengharuskan setiap konstanta mengimplementasikannya:
enum class Op(val symbol: String) {
PLUS("+") {
override fun apply(a: Int, b: Int) = a + b
},
TIMES("*") {
override fun apply(a: Int, b: Int) = a * b
};
abstract fun apply(a: Int, b: Int): Int
}Di dalam main:
for (op in Op.entries) println("6 ${op.symbol} 3 = ${op.apply(6, 3)}")Output:
6 + 3 = 9
6 * 3 = 18Tantangan
MudahLengkapi enum Size dengan konstanta SMALL (250 ml, harga 300), MEDIUM (350 ml, 380), dan LARGE (500 ml, 450), dengan harga dalam sen. label() mengembalikan medium (350 ml): 3.80, dan upsize() mengembalikan ukuran berikutnya yang lebih besar, atau ukuran yang sama untuk LARGE. parse(text) milik companion mencari ukuran berdasarkan namanya tanpa membedakan huruf besar dan kecil, atau berdasarkan huruf pertamanya (s, M), dan mengembalikan null jika tidak ditemukan.
Kode yang disediakan membaca pesanan seperti medium, L, atau up small (minuman yang ukurannya diperbesar), lalu mencetak setiap label atau unknown size x, dan terakhir total: 11.10.
Letakkan kodemu di Size.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()
var total = 0
for (line in input) {
val upsize = line.startsWith("up ")
val size = Size.parse(line.removePrefix("up "))
if (size == null) {
println("unknown size $line")
continue
}
val chosen = if (upsize) size.upsize() else size
println(chosen.label())
total += chosen.price
}
println("total: %d.%02d".format(total / 100, total % 100))
}
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 BukuLatihan sendiri: Playground Kotlin