我正在尝试创建用于存储资金的价值类别。我需要存储私人货币格式。这是我的代码:
@JvmInline
value class Money internal constructor(val rawValue: String) {
private val format: MoneyFormat = MoneyFormat.WHOLE
我检索到错误:
值类不能具有带支持字段的属性
但另一方面,如果你查看 kotlin.time.Duration 的实现,你可以在那里找到属性
storageUnit
。据我了解,有必要存储当前的持续时间单位。
如何在我的类中保存格式,以便添加可以将资金从一种格式转移到另一种格式的方法?
内联/值类的全部要点是,在内部我们不实例化该类的对象,而是直接使用它的单个值(至少在可能的情况下)。在你的情况下,这意味着我们不想传递
Money
对象,而是直接传递一个字符串。我们无法在字符串对象中存储这个额外的 format
值,因此我们无法添加这样的属性。
Duration.storageUnit
不同:
private val storageUnit get() = if (isInNanos()) DurationUnit.NANOSECONDS else DurationUnit.MILLISECONDS
它不在对象中存储任何附加数据。每当我们访问
storageUnit
属性时,它都会动态计算所需的值并返回它。它不会将其存储在任何地方。
看看你的例子,我想你也想做同样的事情:
private val format: MoneyFormat get() = MoneyFormat.WHOLE
请注意
get()
。这与您的原始代码不同。您的代码在实例化对象时创建一个字段并存储 MoneyFormat.WHOLE
。添加 get()
后,不会创建字段,只有 getter,并且 getter 返回 MoneyFormat.WHOLE
。