Java:静态瞬态字段

56

我刚发现在Java中你可以声明一个字段为 "static transient" - 编译器不会抱怨。这似乎没有任何用处,因为我们都知道静态字段不会被序列化。

但我想知道是否有一种情况下 'static transient' 字段是有用的?


40
通过反射可以检测静态瞬态字段。您可以编写自己的序列化程序来处理XML、JSON等格式,并且如果您意图保存静态变量,可以给这些变量赋予特殊含义。 - Peter Lawrey
+1 是为了得到一个使用案例。我的理解是它是多余的。 - Nishant
3
顺便说一下:您可以有其他修改器组合,这些组合可能没有太多意义,例如在抽象类上使用公共构造函数或在最终类上使用受保护的构造函数/方法。 - Peter Lawrey
1
通过反射,任何修饰符组合都可以有意义(或多或少);-) - python dude
1
@ Peter Lawrey:我建议您将上面的回复重新发布为单独的答案,这样我就可以将其标记为已接受。 - python dude
事实是:可以肯定地说这可能是Java规范中可以更清晰的一个点。他们本可以防止“静态瞬态”,从而使自定义序列化程序无意义。 - SyntaxT3rr0r
2个回答

19

不行-你自己说了,静态字段不会被序列化。

虽然编译器允许这样做有点奇怪。


22
它们不会被Java内置的序列化程序串行化。但是其他序列化程序可能会有所不同。 - Peter Lawrey
3
即使使用另一个序列化程序,保存静态字段的目的仍然是什么? - Peter C
4
@Peter,顺便提一下,serialVersionUID会是一个例外。 - Ustaman Sangat
@UstamanSangat 或者可以放弃“非 ObjectO”范式并满足于标准的序列化行为。 - user166390

17

在大多数情况下,这是没有用处的。默认的序列化器确实不会序列化静态字段。

然而,static transient 字段可以通过反射检测到。如果有人编写了自己的序列化器并且想要序列化静态字段,那么他可能会考虑使用 transient 关键字并跳过特定字段的序列化。

注:此答案仅供完整性考虑,并基于Peter Lawrey的评论。感谢他。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接