Kotlin / Java, Int türündeki bir anahtar deyiminde enum kullanır

Oct 02 2020

Bir Android projesi için bir .kt dosyam var:

class foo () {
    enum class animal (var Id: Int) {
        CAT(0),
        DOG(1),
        FISH(2),
    }
}

Ve sorunun oluştuğu bir .java dosyası:

public void processAnimal(int animalId) {
    switch(animalId) {
        case foo.animal.CAT.Id:
            //do something
            break;
        case foo.animal.DOG.Id:
            //do something else
            break;
        case foo.animal.FISH.Id:
            //do something fishy
            break;
    }
}

Üzerinde .Id'Id'nin foo.animal içinde özel erişimi var' hatası veriyor, bu yüzden çalışmıyor.

Değişen .Idiçin .getId()çünkü switch ifadesinin 'Sabit ifade gereklidir' verir.

İmza intyerine tipin olması benim kontrolüm dışında bir gereklilik ve kontrolüm dışında olmasaydı bu doğru çözüm olurdu.animalpublic void processAnimal(int animalId) {

.Kt dosyasında alanları genel olarak işaretlemek hiçbir şeyi değiştirmez.

Yapmak istediğim şeyi başarmanın bir yolu var mı?

Teşekkür ederim!

Yanıtlar

4 Alex.T Oct 02 2020 at 14:18

Bu çalışmayı yapmanın tek yolu (java anahtarı sınırlamalarından dolayı), enum sınıfının kendisinde bunu Idbir numaralandırmaya çevirmemize izin verecek bir yardımcı işlev oluşturmaktır Value.

Java işlevi şöyle olacaktır:

public void processAnimal(int animalId) {
    AnimalEnum animalEnum = AnimalEnum.fromInt(animalId);
    switch(animalEnum) {
        case CAT:
            //do something
            break;
        case DOG:
            //do something else
            break;
        case FISH:
            //do something fishy
            break;
    }
}

Ve enum sınıfı şunun gibi görünür:

enum class AnimalEnum(val Id: Int) { //classes should start with an uppercase letter in kotlin
CAT(0),
DOG(1),
FISH(2);

companion object {
    @JvmStatic //to be accessible from java
    fun fromInt(givenInt: Int): AnimalEnum {
        return when (givenInt) {
            CAT.Id -> CAT
            DOG.Id -> DOG
            FISH.Id -> FISH
            else -> throw Exception("Invalid id `$givenInt`, available ids are ${values().map { it.Id }}") // or a null or something
        }
    }
}}

FromInt () işlevini yazmanın başka bir yolu şudur:

companion object {
    private val map = values().associateBy(AnimalEnum::Id)
    @JvmStatic //to be accessible from java
    fun fromInt(givenInt: Int) = map[givenInt] ?: throw Exception("Invalid id `$givenInt`, available ids are ${values().map { it.Id }}") // or a null or something
}

İkinci seçenek o kadar okunabilir değildir, ancak çok sayıda enum değerimiz varsa daha iyidir