我有一个有许多值的枚举;例如,错误代码,或一些官方的编码值列表.在我的应用程序中,我有几个函数,其中只有这些值的子集是允许的.如何派生仅包含原始枚举子集的受限枚举?

例如,我有一个外部提供的错误代码字典,其模型为enum:

enum class ApiError(val: errorCode: Int) {
  INCORRECT_CHARACTER(1),
  MISSING_VALUE(2),
  TOO_SMALL(3),
  TOO_LARGE(4)
}

在一个函数调用中,只会导致TOO_SMALLTOO_LARGE错误,而在另一个函数调用中只会导致INCORRECT_CHARACTERMISSING_VALUE错误.我不想为这些特定的错误返回值定义两个新的枚举,而是希望两者都以某种方式引用包含所有错误代码的完整枚举.

更精确地说:假设我有一个函数fun handleError(error: ApiError);在这个函数中,我希望能够编写一个涵盖所有枚举情况的详尽的when模式匹配.然而,我also希望能够将受限枚举类型的参数传递给同一个函数,其中受限类型只能接受枚举值的子集,如上面的示例所示.

我想到的(但在Kotlin中不起作用)是对ApiError枚举进行子类化,同时限制每个子类中的允许值.有没有类似的Kotlin解决方案?

相反的问题——将枚举子类化以进行扩展——已经详细讨论了here次.据我所知,在限制潜在枚举值时,反对意见并不适用.

出于好奇:我想上述问题是某种类型的理论问题的具体和完全错误的版本.有人能为正确的理论和术语提供指导吗?

推荐答案

我想到的(但在Kotlin中不起作用)是对APIRERROR枚举进行子类化,同时限制每个子类中的允许值.有没有类似的Kotlin解决方案?

是的,如果需要表示层次 struct ,可以使用object作为叶子的密封类/接口层次 struct .

sealed class ApiError(val code: Int) {
    object IncorrectCharacter : ApiError(1)
    object MissingValue : ApiError(2)
}
sealed class SizeError(code: Int): ApiError(code) {
    object TooSmall : SizeError(3)
    object TooLarge : SizeError(4)
}

与枚举相比,这里失go 的是使用ApiError.values()列出所有可能值的能力.但在这种情况下,这可能不是一个问题.

此外,根据您使用的序列化库的不同,序列化(甚至反序列化)可能并不理想.

Kotlin相关问答推荐

Kotlin协程挂起继续线程

编译后的JavaFX应用程序立即以静默方式崩溃

在 Kotlin 中将 Array 转换为 IntArray 时丢失值

collectAsState 未从存储库接收更改

如何注入返回通用列表的转换器?

在Kotlin lambda的参数中如何指定函数类型?

Kotlin:我可以将函数分配给 main 的伴随对象中的变量吗?

从带有 Room 和 Flows 的 SQLite 表中获取祖先树

Kotlin:查找集合中最常见的元素

如何在 android jetpack compose 中相互重叠列表项?

调用单元测试验证伴随对象方法

在 Scaffold Jetpack Compose 内的特定屏幕上隐藏顶部和底部导航器

如何在Spring Boot应用程序上启用承载身份验证?

Kotlin惰性默认属性

如何在Kotlin中创建填充空值的通用数组?

Kotlin中的属性(properties)和参数(parameters)有什么区别?

Kotlin,什么时候按map授权?

在 Kotlin 中编写一个等于 Int.MIN_VALUE 的十六进制整数文字

项目不会使用 Kotlin 1.1.3 构建

Kotlin - 为什么我会得到 KotlinNullPointerException