Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么在单例中声明所有实例字段?_Java_Serialization_Singleton_Effective Java - Fatal编程技术网

Java 为什么在单例中声明所有实例字段?

Java 为什么在单例中声明所有实例字段?,java,serialization,singleton,effective-java,Java,Serialization,Singleton,Effective Java,创建一个使用前两种方法之一实现的单例类 方法可序列化(第11章),仅添加imple是不够的- 可序列化为其声明的字符串。为了维持单身保证,你 必须声明所有实例字段并提供readResolve方法 (项目77)。否则,每次反序列化序列化实例时,都会出现一个新的 实例将被创建 这就引出了我的问题:为什么要声明所有实例字段为瞬态?我认为readResolve就足够了! 我的问题是:为什么作者说我们要在单例中声明所有实例字段都是瞬态的 输出为: this is the one NormalBe

创建一个使用前两种方法之一实现的单例类 方法可序列化(第11章),仅添加imple是不够的- 可序列化为其声明的字符串。为了维持单身保证,你 必须声明所有实例字段并提供readResolve方法 (项目77)。否则,每次反序列化序列化实例时,都会出现一个新的 实例将被创建


这就引出了我的问题:为什么要声明所有实例字段为瞬态?我认为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