首页 > 解决方案 > 为什么 @Transient 不能与 val 字段一起使用?

问题描述

我写了数据类

data class FileHeader(
    val relativePath: String,
    val orderNumber: Long,
    val bodySize: Int
) : Serializable {
@Transient
var headerSize: Int = 0
    get() = relativePath.length + 8
}

它按我的预期工作。

但是为什么我不能将@Transient 与 val 字段一起使用?

错误是:

此注释不适用于没有支持字段或委托的目标成员属性

以这种方式实施有什么原因吗?

标签: kotlin

解决方案


注释

将注释属性的 JVM 支持字段标记为transient,这意味着它不是对象的默认序列化形式的一部分。

默认序列化适用于字段,不关心 getter 方法。因此,如果没有支持字段,则无需序列化(也无需transient在字节码中标记)。在这种情况下,注释将毫无用处,因此设计人员选择将其设为错误。

如果您不明白为什么没有支持字段:

如果属性使用至少一个访问器的默认实现,或者自定义访问器通过字段标识符引用它,则将为属性生成支持字段。

使用您var的 ,默认设置器需要支持字段;当您将其更改为 时val,它不是。


推荐阅读