【问题标题】:Is there any way by which I can save the state of `static members`?有什么方法可以保存“静态成员”的状态吗?
【发布时间】:2011-07-10 21:53:52
【问题描述】:

就像我们使用序列化保存instance variables 的方式一样,有什么方法可以保存static 成员的状态吗?

如果有一种情况,需要恢复静态成员的状态来恢复某些东西,该怎么做?

【问题讨论】:

  • 使用任何东西,据我所知,我们无法使用序列化保存静态成员,序列化是例如成员/对象。
  • 类的静态成员会在将类加载到 jvm 后重新构建自己,因此无需保存该状态。这是你要找的吗?
  • “重构”是什么意思?它们将被创建,但将使用默认值进行初始化,对吗?所以他们正在恢复我猜的任何价值。
  • @CoolBeans @Salman 我不是 Java 用户,但静态的东西仍然有状态,不是吗?它可能有难闻的气味,但我可以想象在某些情况下,您希望恢复类的静态状态,而不仅仅是重新初始化它。
  • @10101010 使用“Singleton”来存储这个“静态”的东西在这里可能很有用——它需要修改代码,如果对静态成员做了更棘手的事情,可能还需要一些评论.通过适当的控制,Singleton 对象本身可能是一个静态成员——有所有的注意事项。然后可以像任何其他对象一样对 Singleton 对象进行序列化/反序列化。

标签: java serialization static static-members


【解决方案1】:

我想到的最简单的选择是使用singleton 而不是静态字段。单例对象可以被序列化和反序列化,并且您可以管理它的生命周期,同时保留静态字段为您提供的“全局状态”(也就是说,全局状态是一件坏事,但这是另一个话题)

否则 - 在类加载器的整个生命周期(通常意味着 JVM 的生命周期)中都会保留静态状态。因此,如果你想保持状态,在关机时执行它并在类加载时恢复它是有意义的。

  • Runtime.addShutdownHook(..) 在关机时执行序列化
  • 使用static {..} 块在下次打开时加载它

序列化格式可以是任何东西。 JSON、BSON、java 序列化(使用ObjectOutputStream

但这是不寻常的,在大多数情况下是错误的做法。因此,请确保这是您想要的。如果您只是希望状态在应用程序的整个生命周期内都存在,请不要做任何事情。如果你想持久化一些东西,要么选择单例选项,要么考虑使用小型数据库而不是静态字段。

【讨论】:

  • 虽然我可能会使用 addShutdownHook 作为后备,但我通常会在更高级别保存状态 - 在关闭期间出现问题的机会很多。在某些未知条件下,那里的错误会破坏保存,这将是地狱的调试。对单身建议 +1。
  • @Ed Staub 当然。我要强调的是,这个解决方案是对问题的直接回答,但在大多数情况下是错误的做法
猜你喜欢
  • 2023-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-24
  • 2023-03-06
  • 1970-01-01
相关资源
最近更新 更多