Kotlin / Java, Int türündeki bir anahtar deyiminde enum kullanır
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
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