首页 > 解决方案 > 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 文件中将字段标记为公开不会改变任何内容。

有没有办法实现我的目标?

谢谢!

标签: javakotlin

解决方案


我能想到的唯一方法(由于 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
}

第二个选项不那么可读,但如果我们有很多枚举值会更好


推荐阅读