Java 为什么在单例中声明所有实例字段?
创建一个使用前两种方法之一实现的单例类 方法可序列化(第11章),仅添加imple是不够的- 可序列化为其声明的字符串。为了维持单身保证,你 必须声明所有实例字段并提供readResolve方法 (项目77)。否则,每次反序列化序列化实例时,都会出现一个新的 实例将被创建Java 为什么在单例中声明所有实例字段?,java,serialization,singleton,effective-java,Java,Serialization,Singleton,Effective Java,创建一个使用前两种方法之一实现的单例类 方法可序列化(第11章),仅添加imple是不够的- 可序列化为其声明的字符串。为了维持单身保证,你 必须声明所有实例字段并提供readResolve方法 (项目77)。否则,每次反序列化序列化实例时,都会出现一个新的 实例将被创建 这就引出了我的问题:为什么要声明所有实例字段为瞬态?我认为readResolve就足够了! 我的问题是:为什么作者说我们要在单例中声明所有实例字段都是瞬态的 输出为: this is the one NormalBe
这就引出了我的问题:为什么要声明所有实例字段为瞬态?我认为readResolve就足够了!
我的问题是:为什么作者说我们要在单例中声明所有实例字段都是瞬态的 输出为:
this is the one NormalBean [id=12345, name=jack, getClass()=class com.effective.test.NormalBean, hashCode()=366712642]
this is the one NormalBean [id=12345, name=jack, getClass()=class com.effective.test.NormalBean, hashCode()=366712642]
still the One?true
我认为,如果您在单个JVM中使用它,任何问题都不会突出(无论您如何序列化它,该类都将保留静态单例实例的引用)。也许在序列化之后重新启动并读取文件会有所帮助,但我认为类加载应该在反序列化之前进行 它还考虑了性能问题。如果您不需要序列化字段的值,因为它们对于单例是相同的,那么为什么要序列化它,例如通过网络发送,然后执行
readResolve
以忽略您收到的值
(第11章)
什么的第11章
要维护单例保证,必须声明所有实例字段
不,你没有。提供单例保证不需要使实例变量成为瞬态变量。提供readResolve()
方法就足够了
我的问题是:为什么作者说我们要在单例中声明所有实例字段都是瞬态的 什么作家?什么的作者?他在哪里说的?他到底说了些什么?你的问题是什么
他可能认为,作为一种性能改进,序列化不使用的数据只会浪费时间和空间。如果将实例变量标记为瞬态变量,就是告诉JVM跳过 (忽略)尝试序列化包含此变量的对象时,忽略此变量。 序列化是Java最酷的特性之一;它允许您保存(有时称为 “展平”)通过写入对象的状态(换句话说,其实例的值)来对对象进行展平 变量)转换为特殊类型的I/O流。通过序列化,可以保存对象 到一个文件,或者甚至通过一根导线将其传送到另一端,以便在
另一个JVM。为什么要声明所有实例字段?我认为readResolve就足够了!在以下情况下,实例将如何保存:加载jvm、将类写入文件、卸载jvm、加载jvm、从文件重新加载类?我的问题是:为什么作者说我们要声明所有实例字段都是单例瞬态的?不要对未引用的文本使用引号格式,而对引用的文本使用引号格式。您的问题完全不可理解,因为滥用了提供的格式化功能。我的问题是:为什么作者说我们应该在singletonsEffective java中声明所有实例字段都是瞬态的。
this is the one NormalBean [id=12345, name=jack, getClass()=class com.effective.test.NormalBean, hashCode()=366712642]
this is the one NormalBean [id=12345, name=jack, getClass()=class com.effective.test.NormalBean, hashCode()=366712642]
still the One?true