Java中static final transient的作用是什么?
What is the effect of static final transient in Java?
在我正在处理的代码库中,几乎所有声明为 static final String
的变量也被声明为 transient
。
所以我有这样的字段:
public static final transient String VERSION = "1.0";
每当我发现这些 transient
关键字时,我很想删除它们,因为我认为它没有任何用处。
在这种情况下使用或不使用 transient
在行为上有什么不同吗?
变量上的transient
关键字将确保在序列化时变量不是序列化对象的一部分。如果您的 class 不是 serializable
,也不是 JPA 实体(它使用 transient 关键字来避免在数据库中存储变量),删除它应该没问题。
一个static
字段是隐含的transient
(当序列化一个static
字段时,它的值无论如何都会丢失)。所以确实,不需要同时声明两者。
static 成员与 class 而不是对象相关联,因此在反序列化时您将看到您传递的值,而不是使用 transient 时显示的默认值。
为了更好地理解,尝试在序列化之后更改变量的值,然后在反序列化时,您会看到序列化成员的值相同,但静态成员已更改。
根据 transient final,final 变量确实通过其值直接参与序列化,因此无需将 final 变量声明为 transient。
在我正在处理的代码库中,几乎所有声明为 static final String
的变量也被声明为 transient
。
所以我有这样的字段:
public static final transient String VERSION = "1.0";
每当我发现这些 transient
关键字时,我很想删除它们,因为我认为它没有任何用处。
在这种情况下使用或不使用 transient
在行为上有什么不同吗?
变量上的transient
关键字将确保在序列化时变量不是序列化对象的一部分。如果您的 class 不是 serializable
,也不是 JPA 实体(它使用 transient 关键字来避免在数据库中存储变量),删除它应该没问题。
一个static
字段是隐含的transient
(当序列化一个static
字段时,它的值无论如何都会丢失)。所以确实,不需要同时声明两者。
static 成员与 class 而不是对象相关联,因此在反序列化时您将看到您传递的值,而不是使用 transient 时显示的默认值。 为了更好地理解,尝试在序列化之后更改变量的值,然后在反序列化时,您会看到序列化成员的值相同,但静态成员已更改。 根据 transient final,final 变量确实通过其值直接参与序列化,因此无需将 final 变量声明为 transient。