gpt4 book ai didi

kotlin - Corda State Evolution-可为空与默认属性

转载 作者:行者123 更新时间:2023-12-02 13:12:47 27 4
gpt4 key购买 nike

在Corda中,向状态添加新属性(状态演化)要求新属性可以为空,以便与该状态的先前版本向后兼容。

data class Version1DummyState(
override val participants: List<AbstractParty>
) : ContractState

data class Version2DummyState(
override val participants: List<AbstractParty>,
val myNewProperty: String? = null
) : ContractState

由于Kotlin还支持具有默认值的属性,因此我想知道为什么状态演化仅限于 可空类型的属性,而不限于非空属性,前提是这些属性具有默认值?
data class Version2DumyState(
override val participants: List<AbstractParty>,
val myNewProperty: String = "Hello, world."
) : ContractState

我提出这个问题的理由来自于查看隐式升级样本,在该样本中,义务状态被升级以允许债务人违约。 truefalse准确表示债务人是否已默认,但 null没有。使用 false的默认值进行升级的能力似乎比使用可空字段更自然。

最佳答案

我认为您可以通过使用@JvmOverloads标记构造函数来实现这一目的,如下所示:

data class DummyState @JvmOverloads constructor(
override val participants: List<AbstractParty>,
val myNewProperty: String = "blah"
) : ContractState

(不要将版本号放入状态类名称中)
@JvmOverloads使反序列化引擎可以看到“旧的”构造函数以进行匹配。

但是,最好在这里用如下代码来明确表示:
val inDefault: Boolean get() = myNewProperty ?: false
要么
fun priceOr(default: Amount<Currency> = 0.USD) get() = price ?: default
如果您真的想要这个。

向后兼容性和默认值需要非常小心地对待。一个常见的错误是对新引入的字段使用默认值零/空字符串/ false,即使这些值对应用程序在语义上有意义。也就是说,知道旧消息未指定某些内容是有值(value)的信息,不应丢失或将其替换为脆弱的哨兵值。考虑新的字段“价格”。价格不能为负,因此开发人员可能会将默认值设置为零。但是免费定价是一件有意义的事情-也许不是在当今的业务环境中,还是明天?现在你有问题了。

Kotlin的类型系统和语法非常擅长处理缺失值。使用 ?:运算符在使用现场替换默认设置非常容易,我担心建立一个约定,始终在初级开发人员遵循的施工现场提供默认设置,而又不知道潜在的后果。明确暴露默认值可以替代的事实迫使人们思考这是否真的合乎逻辑。

关于kotlin - Corda State Evolution-可为空与默认属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56967850/

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