【问题标题】:Kotlin / Java use enum in a switch statement of type IntKotlin / Java 在 Int 类型的 switch 语句中使用枚举
【发布时间】:2021-01-17 19:25:13
【问题描述】:

对于一个 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() 会给出“需要常量表达式”。

在签名public void processAnimal(int animalId) { 中,类型为int 而不是animal,这是我无法控制的要求,如果它不是我无法控制的,这将是正确的解决方案。

在 .kt 文件中将字段标记为公开不会改变任何内容。

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

谢谢!

【问题讨论】:

  • 可能感兴趣:stackoverflow.com/questions/41039875/… 但我做不到。
  • 你必须在java中使用getId()。 Kotlin 成员变量不是原始字段,它们是 getter 和 setter,支持字段或实际变量始终是私有的(除非您使用 @JvmField 注释)。
  • 是的,这不是静态的。但不幸的是,即使我将enum class animal (var Id: Int) { 更改为enum class animal (@JvmField var Id: Int) {,错误也会更改为“需要常量表达式”,因此显然即使 .Id 也不是静态的。

标签: java kotlin


【解决方案1】:

我能想到的唯一方法(由于 java 开关限制)是在枚举类本身中创建一个帮助函数,这将允许我们将 Id 转换为枚举 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
}

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

【讨论】:

  • 看来你真的很了解 Kotlin,如果你找不到简单的方法,那么我想我们可以有把握地说不存在。但我仍然对解决方案印象深刻。谢谢。
  • 要记住的是,Kotlin 可以在 Java 中正常工作,但如果没有它,效果会好很多。如果枚举仅由 Kotlin 函数使用,则您无需执行任何操作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-27
  • 2012-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多