【问题标题】:What is the effect of static final transient in Java?Java中静态最终瞬态的作用是什么?
【发布时间】:2023-03-10 15:51:01
【问题描述】:

在我正在处理的代码库中,几乎所有声明为 static final String 的变量也声明为 transient

所以我有这样的字段:

public static final transient String VERSION = "1.0";

每当我发现这些 transient 关键字时,我都想删除它们,因为我认为它没有任何用途。

在这种情况下使用transient 与不使用之间的行为有什么不同吗?

【问题讨论】:

  • 我假设您特别指的是与final 的组合,所以stackoverflow.com/questions/4565653/… 不会是合理的重复,对吧?
  • 请看这里 :) transient variables – Ruthi Ruth
  • 到底谁使用序列化?删除所有瞬变! :)
  • 我的问题是为什么你有这些 VERSION 变量。我的猜测是,它们在创建类时被硬编码为“1.0”,然后在之后的几年里保持不变。如果您问我,请删除整个内容。
  • @Tobb:版本只是一个例子。它基本上用于所有字符串常量

标签: java static final transient


【解决方案1】:

变量上的transient 关键字将确保在序列化时该变量不是序列化对象的一部分。如果您的类不是serializable,也不是JPA 实体(它使用transient 关键字来避免在数据库中存储变量),删除它应该没问题。

【讨论】:

【解决方案2】:

static 字段隐含为transient(序列化static 字段时,它的值无论如何都会丢失)。所以确实,不需要同时声明两者。

【讨论】:

  • 如果你能添加一个来源会很棒,但无论如何它看起来都是正确的答案。
  • 当您说值丢失时,该字段是否是没有值的序列化的一部分(例如 null),还是该字段永远不会作为属性?
【解决方案3】:

静态成员与不与对象关联的类关联,因此在反序列化时,您将看到您传递的值,而不是使用瞬态时显示的默认值。 为了更好地理解,尝试在序列化之后更改变量的值,然后在反序列化时,您会看到序列化成员的值是相同的,但静态成员的值已经改变。 根据 transient final ,final 变量确实通过它们的值直接参与序列化,因此没有使用将 final 变量声明为瞬态。

【讨论】:

  • 我可能遗漏了一些东西,但我看不出这对接受的答案有什么影响。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-01
  • 1970-01-01
  • 2011-06-02
  • 1970-01-01
  • 2010-12-16
  • 2011-03-17
相关资源
最近更新 更多