gpt4 book ai didi

kotlin - 使用可为空值实现类型安全的类层次结构

转载 作者:行者123 更新时间:2023-12-04 21:29:42 25 4
gpt4 key购买 nike

我(通常)有一个资源有两个状态,预创建和后创建,其中两个状态具有相同的字段,除了 id field 。 id在创建前状态下为 null,在创建后状态下为非 null。

我想以干净且类型安全的方式定义和使用此资源。

通常将此 ID 字段表示为可空值,这样可以在类定义中使用最少的样板来处理这两种情况。问题是它在业务逻辑中创建了很多样板文件,因为您无法通过查看其类型来断言资源是预先创建的还是后创建的。

这是可空方法的示例:
data class Resource(val id: String?, val property: String)
这很容易定义,但由于缺乏编译时保证,因此处理起来并不简单。

这是一个更类型安全的方法的例子:

sealed class Resource(val property: String) {
class WithoutID(property: String): Resource(property)
class WithID(val id: String, property: String): Resource(property)
}

这让我可以绕过 Resource.WithIDResource.WithoutID ,除了 id 之外,它们具有所有相同的字段和方法。 .

这种类型安全方法的一个不便之处在于,当您有很多 property 时,资源定义代码会变得非常臃肿。领域。这种膨胀使代码更难阅读。

我想知道是否有一种减少样板的替代方法,或者 Kotlin 是否有任何功能可以使这种事情变得更简单。

最佳答案

怎么定义

sealed class MayHaveId<T> { abstract val record: T }
class WithId<T>(val id: String, override val record: T): MayHaveId<T>()
class WithoutId<T>(override val record: T): MayHaveId<T>()

class Resource(val property: String)
// and other similar types

并使用 WithId<Resource>WithoutId<Resource> ?在 Scala 中,您可以添加来自 MayHaveId<T> 的隐式转换至 T ,但在 Kotlin 中不行,唉,你也不能写 : T by record .仍然应该足够干净才能使用。

关于kotlin - 使用可为空值实现类型安全的类层次结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56447513/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com