当前位置: 首页 > 知识库问答 >
问题:

为什么在 Eager 初始化中,在类加载时创建的单例类实例可以考虑一个缺点?

罗心思
2023-03-14

我知道静态变量是在运行时加载的,尽管我认为我理解这个问题,但我在下一个E的初始化辛格尔顿实现中遇到了麻烦:

在紧急初始化中,Singleton类的实例是在类加载时创建的,这是创建单例类的最简单方法,但它有一个缺点,即即使客户端应用程序可能不使用实例,也会创建实例。

public class EagerInitializedSingleton {

private static final EagerInitializedSingleton instance = new EagerInitializedSingleton();

//private constructor to avoid client applications to use constructor
private EagerInitializedSingleton(){}

public static EagerInitializedSingleton getInstance(){
    return instance;
}

}

如果类的构造函数是< code>private,如何在类加载时创建类实例?它只有一个< code>public入口点,客户端必须显式调用它,对吗?

共有3个答案

施永贞
2023-03-14

我将从我目前的项目中给出一个非常新的例子。一些模式的Hibernate存储库被急切地初始化为单模式。还有一些客户机使用外部web服务。同时,我们想要工作的子系统不需要访问数据库。尽管如此,该应用程序在专用网络之外并没有受到惊吓。此外,如果任何数据库服务器停止,应用程序将无法再次启动。

如果您急切地加载任何单例,请确保它们至少没有任何对外部系统的引用!

钱安和
2023-03-14

加载类时初始化静态变量。

在调用EagarInitializedSingleton.get实例()时加载该类,但如果访问类似EagarInitializedSingleton.class的内容,则可以更早地加载该类。

寿毅庵
2023-03-14

为什么在 Eager 初始化中,在类加载时创建的单例类实例可以考虑一个缺点?

正如你引用的原文所说:

"...它有一个缺点,即即使客户端应用程序可能没有使用它,也会创建实例。

为什么这是一个缺点?

因为:

  • 创建实例可能计算成本高(并增加启动时间)
  • 实例可能会占用大量内存。

如果类的构造函数是私有的,那么如何在类加载时创建类实例?

它是在计算实例的初始化表达式时创建的。当初始化 EagerInializedSingleton 类时会发生这种情况......这通常在加载类时发生。

表达式调用私有构造函数。但这没关系,因为类中的代码可以看到它自己的私有字段/方法和构造函数。

这是否意味着当我们调用getInstance方法时,类正在被加载?

不一定。在那之前可能会发生。但在那之后就不会发生了。

1-…除非您创建了初始化依赖周期。

 类似资料:
  • 我已经完成了一些Java教程,它们都说在调用类时创建一个新变量。这是为什么?我已经测试了一些代码,但它没有这样做。我已经使用python很长一段时间了,所以我习惯于使用动态语言。 请看下面我一直在玩的一些代码: 谢谢你的时间。

  • 本文向大家介绍简单了解java类的初始化以及类的实例化,包括了简单了解java类的初始化以及类的实例化的使用技巧和注意事项,需要的朋友参考一下 前言 上一篇我们知道了一个类的生命周期是:加载->验证->准备->解析->初始化->使用->卸载。 当初始化完成以后,一个类所有的类变量(被static修饰的变量)都被赋值。但是未被static修饰的成员变量又是何时被赋值的呢? 一个类何时会被初始化 一个

  • 我知道类和抽象类的主要区别是,抽象类不能被实例化, 但是我可以为抽象类创建对象 我用新的关键字创建了抽象的对象 我有一些问题在 Inet 上没有正确的答案, new关键字是否用于实例类? 2)实例只不过是对象吗? 3)mEarth被称为物体(地球的实例)吗? 现在我可以调用任何方法(作为回调或作为值返回)mearth . sand();mearth . land();使用地球物体

  • 本文向大家介绍创建一个类Person的简单实例,包括了创建一个类Person的简单实例的使用技巧和注意事项,需要的朋友参考一下 创建一个类Person,包含以下属性:姓名(name)、年龄(age)、朋友(friends数组)、问候(sayhi方法,输出问候语,例如:“你好!”)、交朋友(addFriend方法,向friends里添加一个值),然后创建两个此类的实例:“小张“,22,[“小李”,”

  • 我对英语不是很熟悉。我会试着解释这个问题。我正在学习使用spring-boot框架。我正在配置模型部分。所以我使用注释@Entity、@Table创建了数据库表 在创建表之后,我为每个表创建了DAO。 我正在学习一个教程,但我没有做其他的事情。 > 操作 } DAOS: pom.xml: 应用程序.属性:

  • 我有一个带有“LevelManager”单例实例(并与之接口)的“SingletonManager”类。“LevelManager”GameObject不应该在整个应用程序生命周期内持久存在,并且应该在每次加载新级别时替换为新实例。 在运行我当前的代码时,当场景第二次加载时,“LevelManager”似乎丢失了,尽管场景中有GameObject(附加脚本)。我意识到这可能是因为我仍在尝试访问旧的