java - Kotlin / Java 在 Int 类型的 switch 语句中使用枚举
问题描述
对于 Android 项目,我有一个 .kt 文件:
class foo () {
enum class animal (var Id: Int) {
CAT(0),
DOG(1),
FISH(2),
}
}
还有一个 .java 文件,出现问题的地方:
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;
}
}
它给出了.Id
一个错误'Id 在 foo.animal 中有私有访问权限',所以这不起作用。
由于 switch 语句,更改.Id
为“需要常量表达式”。.getId()
类型int
不是animal
在签名中是我无法控制的要求,public void processAnimal(int animalId) {
如果它不是我无法控制的,这将是正确的解决方案。
在 .kt 文件中将字段标记为公开不会改变任何内容。
有没有办法实现我的目标?
谢谢!
解决方案
我能想到的唯一方法(由于 java 开关的限制)是在 enum 类本身中创建一个帮助函数,这将允许我们将其Id
转换为 enum Value
。
java函数将是:
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;
}
}
枚举类看起来像这样:
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() 函数的方法是:
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
}
第二个选项不那么可读,但如果我们有很多枚举值会更好