Menu
Coddy logo textTech

Enum Sınıfları

Coddy'nin Kotlin Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 33 / 57.

Bir enum class, sabit bir değer kümesine, yani sabitlerine sahip bir tür bildirir. Her sabit, name ve 0'dan başlayan konumunu belirten bir ordinal değerine sahip enum nesnesidir. entries bunları sırayla listeler:

enum class Direction { NORTH, EAST, SOUTH, WEST }

main içinde:

val d = Direction.EAST
println(d)
println(d.ordinal)
println(Direction.entries)

Çıktı:

EAST
1
[NORTH, EAST, SOUTH, WEST]

Enum sabitleri, enum oluşturucusuna geçirilen özelliklere sahip olabilir ve enum metotlar tanımlayabilir. Noktalı virgül, üyelerden önce sabitler listesini sonlandırır:

enum class Coin(val cents: Int) {
    PENNY(1), NICKEL(5), DIME(10), QUARTER(25);

    fun label() = "${name.lowercase()} ($cents c)"
}

main içinde:

println(Coin.DIME.label())
println(Coin.entries.sumOf { it.cents })

Çıktı:

dime (10 c)
41

Her sabiti listeleyen bir enum üzerindeki when için else gerekmez ve derleyici eksik olan sabiti bildirir. valueOf("SOUTH"), tam adıyla bir sabiti bulur ve bilinmeyen bir sabit için hata verir; bu nedenle girdi genellikle entries.find ile eşleştirilir:

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

main içinde:

println(turnRight(Direction.valueOf("SOUTH")))
println(parse("north"))
println(parse("up"))

Çıktı:

WEST
NORTH
null

Bir sabitin kendi gövdesi olabilir ve burada bir metodu geçersiz kılabilir. Enum'da metodu abstract olarak bildirmek, her sabitin bu metodu uygulamasını zorunlu kılar:

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
}

main içinde:

for (op in Op.entries) println("6 ${op.symbol} 3 = ${op.apply(6, 3)}")

Çıktı:

6 + 3 = 9
6 * 3 = 18
challenge icon

Görev

Kolay

Size enum'unu SMALL (250 ml, fiyat 300), MEDIUM (350 ml, 380) ve LARGE (500 ml, 450) sabitleriyle tamamla; fiyatlar cent cinsindendir. label(), medium (350 ml): 3.80 döndürür ve upsize(), bir sonraki büyük boyutu veya LARGE için aynı boyutu döndürür. Companion nesnesinin parse(text) işlevi, büyük/küçük harf duyarlılığını yok sayarak ada göre veya ilk harfe göre (s, M) bir boyut bulur ve aksi durumda null döndürür.

Sağlanan kod medium, L veya up small (büyütülmüş içecek) gibi siparişleri okur ve her etiketi veya unknown size x ifadesini yazdırır; son olarak total: 11.10 yazdırılır.

Kodun Size.kt dosyasına yazılmalıdır. Main.kt, sağlanan girdi/çıktı kodunu içerir ve düzenlenemez.

Kendin dene

fun main() {
    // Sağlanan girdi/çıktı kodu: olduğu gibi bırakın
    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 iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Nesne Yönelimli Programlama bölümündeki tüm dersler

Kendi başına pratik yap: Kotlin playground