Menu
CoddyTech

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)
41

Sebuah 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
null

Sebuah 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 = 18
challenge icon

Tantangan

Mudah

Lengkapi 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))
}
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