我(通常)有一个具有两个状态的资源,即创建前和创建后两个状态,其中两个状态除字段外均具有相同的id
字段。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)
}
Run Code Online (Sandbox Code Playgroud)
这使我可以绕过Resource.WithID
和Resource.WithoutID
,除了之外,它们具有所有相同的字段和方法id
。
这种类型安全的方法的一个不便之处是,当您有很多property
字段时,资源定义代码就会变得肿。这种膨胀使代码更难阅读。
我想知道是否有另一种方法来减少样板,或者Kotlin是否具有使这种事情变得更简单的功能。
properties
选择之一是依靠内部接口进行组合。
interface Resource {
val property: String
}
interface WithId : Resource {
val id: Int
}
interface WithOtherField : Resource {
val otherField: Any
}
class WithoutIdImpl(override val property: String) : Resource
class WithIdImpl(override val id: Int, override val property: String) : WithId
class WithIdAndOtherField(
override val id: Int,
override val otherField: Any,
override val property: String) : WithId, WithOtherField
Run Code Online (Sandbox Code Playgroud)
我没有从你的例子中得到,你将如何在 的两种状态之间切换Resource
。因此,可能存在需要克服的差距。也许,智能转换将允许切换状态。
归档时间: |
|
查看次数: |
62 次 |
最近记录: |