jvm Kotlin.如何在值类中存储属性?

lxkprmvk  于 8个月前  发布在  Kotlin
关注(0)|答案(1)|浏览(51)

我想创造一个存钱的价值阶级。我需要存储私人货币格式。下面是我的代码:

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

    private val format: MoneyFormat = MoneyFormat.WHOLE

我检索错误:
值类不能具有带支持字段的属性
但另一方面,如果你看一下Kotlin.time.Duration的实现,你可以在那里找到属性storageUnit。而且据我所知,有必要存储当前的持续时间单位。
我如何保存类中的格式,以便添加可以将货币从一种格式转换为另一种格式的方法?

00jrzges

00jrzges1#

内联/值类的全部意义在于,在内部我们不示例化类的对象,而是直接使用它的单个值(至少在可能的情况下)。在你的例子中,这意味着我们不想传递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

相关问题