如何创建一个带有多个参数但只使用其中一个参数进行比较初始化的枚举class?
How to create an Enum class that takes multiple parameters but only uses one of them for comparison initialization?
我希望我的枚举 class 采用两个参数,但在比较要初始化的类型时只使用其中一个。在这里,我也希望在初始化期间传递 id,但不使用它来控制创建哪种类型。
enum class ActionEnum(val action: String, val id: String) {
URL("URL") {
override fun start() {
openUrl(id)
}
},
START_FRAGMENT("FRAG") {
override fun start() {
startFragmentWithId(id)
}
},
START_POPUP("POPUP"){
override fun start() {
startPopUpWithMessage(id)
}
};
open fun start() {
}
}
从你的问题来看,你并不清楚你打算用参数 action
做什么,但我认为你正在寻找的是 sealed classes.
您可以定义一个密封的 class 而不是定义一个枚举
sealed class ActionEnum(val action: String, val id: String) {
class URL(action: String): ActionEnum(action, "URL") {
override fun start() {
openUrl(id)
}
}
class START_FRAGMENT(action: String): ActionEnum(action, "FRAG") {
override fun start() {
startFragmentWithId(id)
}
}
class START_POPUP(action: String): ActionEnum(action, "POPUP") {
override fun start() {
startPopUpWithMessage(id)
}
};
open fun start() {
}
}
您可以像枚举一样使用它,这意味着例如你有详尽的 when
而不需要 else
子句:
val a: ActionEnum = ActionEnum.URL("some action")
when(a) {
is ActionEnum.URL -> ...
is ActionEnum.START_FRAGMENT -> ...
is ActionEnum.START_POPUP -> ...
// no more cases possible because ActionEnum is sealed
}
但是每个“枚举”元素可以有不同的实例,其中 action
可以有不同的值——这对于真正的枚举是不可能的。
我希望我的枚举 class 采用两个参数,但在比较要初始化的类型时只使用其中一个。在这里,我也希望在初始化期间传递 id,但不使用它来控制创建哪种类型。
enum class ActionEnum(val action: String, val id: String) {
URL("URL") {
override fun start() {
openUrl(id)
}
},
START_FRAGMENT("FRAG") {
override fun start() {
startFragmentWithId(id)
}
},
START_POPUP("POPUP"){
override fun start() {
startPopUpWithMessage(id)
}
};
open fun start() {
}
}
从你的问题来看,你并不清楚你打算用参数 action
做什么,但我认为你正在寻找的是 sealed classes.
您可以定义一个密封的 class 而不是定义一个枚举
sealed class ActionEnum(val action: String, val id: String) {
class URL(action: String): ActionEnum(action, "URL") {
override fun start() {
openUrl(id)
}
}
class START_FRAGMENT(action: String): ActionEnum(action, "FRAG") {
override fun start() {
startFragmentWithId(id)
}
}
class START_POPUP(action: String): ActionEnum(action, "POPUP") {
override fun start() {
startPopUpWithMessage(id)
}
};
open fun start() {
}
}
您可以像枚举一样使用它,这意味着例如你有详尽的 when
而不需要 else
子句:
val a: ActionEnum = ActionEnum.URL("some action")
when(a) {
is ActionEnum.URL -> ...
is ActionEnum.START_FRAGMENT -> ...
is ActionEnum.START_POPUP -> ...
// no more cases possible because ActionEnum is sealed
}
但是每个“枚举”元素可以有不同的实例,其中 action
可以有不同的值——这对于真正的枚举是不可能的。