对于 Android 项目,我有一个 .kt 文件:
class foo () {
enum class animal (var Id: Int) {
CAT(0),
DOG(1),
FISH(2),
}
}
Run Code Online (Sandbox Code Playgroud)
还有一个 .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;
}
}
Run Code Online (Sandbox Code Playgroud)
它.Id
给出了一个错误“Id has private access in foo.animal”,所以这不起作用。
由于 switch 语句,更改.Id
为“需要常量表达式”。.getId()
这是我无法控制的要求,而不是int
签名animal
中的类型public void processAnimal(int animalId) {
,如果它不是我无法控制的,这将是正确的解决方案。
在 .kt 文件中将字段标记为公共不会改变任何内容。
有没有办法实现我打算做的事情?
谢谢你!
我能想到的实现这项工作的唯一方法(由于 java switch 限制)是在 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;
}
}
Run Code Online (Sandbox Code Playgroud)
枚举类看起来像这样:
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
}
}
}}
Run Code Online (Sandbox Code Playgroud)
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
}
Run Code Online (Sandbox Code Playgroud)
第二个选项可读性较差,但如果我们有很多枚举值则更好
归档时间: |
|
查看次数: |
6628 次 |
最近记录: |