科特林。如何将属性存储在值类中?

问题描述 投票:0回答:1

我正在尝试创建用于存储资金的价值类别。我需要存储私人货币格式。这是我的代码:

@JvmInline
value class Money internal constructor(val rawValue: String) {

    private val format: MoneyFormat = MoneyFormat.WHOLE

我检索到错误:

值类不能具有带支持字段的属性

但另一方面,如果你查看 kotlin.time.Duration 的实现,你可以在那里找到属性

storageUnit
。据我了解,有必要存储当前的持续时间单位。

如何在我的类中保存格式,以便添加可以将资金从一种格式转移到另一种格式的方法?

kotlin jvm value-class backing-field kotlin-inline-class
1个回答
0
投票

内联/值类的全部要点是,在内部我们不实例化该类的对象,而是直接使用它的单个值(至少在可能的情况下)。在你的情况下,这意味着我们不想传递

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

© www.soinside.com 2019 - 2024. All rights reserved.