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

Art*_*nov 5 kotlin

我写了数据类

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

它按我的预期工作。

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

错误是:

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

这样做有什么原因吗?

Ale*_*nov 4

注释

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

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

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

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

对于您的var,默认设置器需要支持字段;当你把它改为 时val,它就不是了。