Singleton Class in Java2025 年 3 月 28 日 | 阅读 4 分钟 在面向对象编程中,类是创建对象的蓝图或模板。从类创建的每个对象都有自己的一组属性(数据)和方法(函数),这些属性和方法定义了它的行为。在某些情况下,我们可能只希望在一个程序的整个生命周期中只有一个类的实例存在。这时就需要用到单例模式。在本文中,我们将讨论 Java 中的单例模式,并提供一些示例程序来说明其用法。 什么是单例类?单例类是只允许创建自身一个实例的类,并提供该实例的全局访问点。这是通过将构造函数设为私有来实现的,这样就无法创建该类的其他实例,并提供一个静态方法来返回该类的唯一实例。 单例模式通常用于需要在系统中协调操作的场景,例如日志或配置系统。它确保只有一个类的实例,该实例可以全局访问,从而防止不必要的重复并确保整个系统的一致性。 在 Java 中实现单例类
示例 1: 饿汉式初始化的单例类 在此示例中,我们将使用饿汉式初始化来创建单例类的唯一实例。这意味着在类加载时创建实例,而不是在第一次访问时创建。 在此示例中,我们声明了一个名为 instance 的私有静态变量来保存类的唯一实例。我们将类的构造函数设为私有,这样就无法创建其他实例,并且我们提供了一个名为 getInstance 的公共静态方法来返回类的唯一实例。getInstance 方法仅返回 instance 变量。 让我们看看如何在一个程序中使用这个单例类。 SingletonDemo.java 输出 Both objects are the same instance. 在此示例中,我们使用 getInstance 方法创建了单例类的两个实例。由于 instance 变量是静态的并在类加载时初始化,因此两个实例将是同一个对象。我们使用 if 语句来检查这两个实例是否是同一个对象,并在控制台打印一条消息表示它们是。 示例 2: 懒汉式初始化的单例类 在上一个示例中,我们使用了饿汉式初始化来创建单例类的唯一实例。如果单例类是轻量级的并且没有其他类的依赖,这种方法效果很好。但是,如果单例类是重量级的或有依赖关系,饿汉式初始化可能不是最佳方法。 在此示例中,我们将使用懒汉式初始化来创建单例类的唯一实例。这意味着在第一次访问时创建实例,而不是在类加载时创建。 在此示例中,我们声明了一个名为 `instance` 的私有静态变量来保存类的唯一实例。与上一个示例不同,我们在声明时未初始化此变量。相反,我们在 `getInstance` 方法中使用懒汉式初始化,在首次访问时创建实例。 对 `getInstance` 方法进行了同步,以防止多个线程创建单例类的多个实例。我们检查 `instance` 变量是否为 null,如果是,则创建一个新的单例类实例。如果 `instance` 变量不为 null,我们仅返回现有实例。 让我们看看如何在一个程序中使用这个单例类。 SingletonDemo.java 输出 Both objects are the same instance. 在此示例中,我们使用 `getInstance` 方法创建了单例类的两个实例。第一次调用 `getInstance` 方法时,将创建实例。第二次调用该方法时,将返回现有实例。我们使用 if 语句来检查这两个实例是否是同一个对象,并在控制台打印一条消息表示它们是。 在本节中,我们讨论了 Java 中的单例模式,并提供了一些示例程序来说明其用法。我们看到了如何使用饿汉式和懒汉式初始化来实现单例类,以及如何在一个程序中使用单例类。单例模式是一种有用的设计模式,可以帮助确保系统的一致性并防止不必要的重复。 |
在编程中,我们通常需要实现只有两个值之一(真或假)的值。为此,Java 提供了一种特殊的数据类型,即布尔类型 (boolean),它可以取 true 或 false 的值。布尔值可以通过...
阅读 2 分钟
在 Java 中,Map 是一个将键映射到值的接口。有时需要实现 Map of Map(嵌套 Map)。嵌套 Map 在许多情况下都很有用,例如存储不同课程的学生姓名及其 ID。在这种情况下,我们创建一个 Map...
阅读 3 分钟
Java 8 引入的 java.util.function 包包含 ToIntFunction 接口,该接口用于在语言中实现函数式编程。它表示一个接受 T 类型参数并输出整数值的函数。只有一个通用...
阅读 3 分钟
在面向对象编程领域,单一职责原则(SRP)是一个基本概念,它在创建干净、可维护和可扩展的代码方面起着至关重要的作用。SRP 是 SOLID 原则之一,SOLID 原则是一套旨在改进软件设计和架构的设计原则……
阅读 6 分钟
使用最少数量的矩形“覆盖”曼哈顿天际线 使用最少数量的矩形“覆盖”曼哈顿天际线 “石墙”问题属于传统的计算问题,其目标是估算建造不同高度的墙所需的方块数量。墙由数组描述...
5 分钟阅读
在 Java 中,数组是一种数据结构,允许您在一个变量中存储相同类型的多个值。它提供了一种方便的方式来处理数据集合。然后使用 Arrays.toString() 和 Arrays.deepToString() 方法来生成值...
阅读 6 分钟
Java 是一种多功能且广泛使用的编程语言,它使用各种机制进行方法分派,这是一个根据方法调用确定应执行哪个方法实现的过程。Java 中的两种主要分派方法是静态分派和动态分派。理解...
阅读 4 分钟
使用费马小定理可以有效地处理在素数 p 模下计算组合的任务。组合公式 nCr 表示从 n 个元素的集合中选择 r 个元素的总方法数。费马小定理提供了一种计算模运算的有效方法……
阅读 10 分钟
可以使用 SimpleTimeZone 类的 setRawOffset() 函数将基本时区偏移量设置为 GMT。为了获得本地时间,将偏移量应用于 UTC。语法:public void setRawOffset(int offsetMillis) 参数:该函数唯一的参数是 offsetMillis,它给出……
阅读 3 分钟
Java 8 为多线程引入了多项新功能和改进,使编写高效、并发的程序更加容易。以下是一些关键功能:Lambda 表达式:Java 8 中最重要的一个新功能是 lambda 表达式,它允许您编写简洁的……
阅读 3 分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India