Java 单例类
本文将在定义级别讨论单例类并强调其重要性。我们将描述编写 Java 单例类的各种设计模式,并借助代码示例对其进行解释。
Java 中的单例类
Java 单例类允许我们一次只创建该类的一个实例,该实例通过这个单一实例(也称为类的对象)全局服务于所有类。单例类不同于用于特定目的的普通类。
它包括避免类的不必要的实例化并确保一次只存在一个对象。它可以节省内存并加快工作速度。
请参阅下面的代码,其中我们有 ABC
和 XYZ
类。ABC
类有一个名为 method1
的方法,它打印字符串 "Hi"
。
我们在 XYZ
类中创建类 ABC
的实例来调用驻留在类 ABC
中的 method1
,我们创建另一个名为 ABC
的实例并再次调用 method1
以在下面打印"Hi"
XYZ
类。现在,我们有两个名为 object1
和 object2
的实例(对象),它们拥有不同的引用,但调用同一类的相同函数。
我们创建了类 ABC
的两个对象,它们是类的不必要实例化。我们可以对单个对象做同样的工作。
其次,每当我们创建一个对象时,它都会占用内存中的空间,这意味着我们通过创建同一个类的多个对象来浪费内存。这就是我们使用单例类来避免这些情况的地方。
示例代码:
public class ABC {
//constructor
public ABC(){}
//method1
public void method1(){
System.out.println("Hi");
}
}
public class XYZ {
//first instance of ABC class
ABC object1 = new ABC();
object1.method1();
//second instance of ABC class
ABC object2 = new ABC();
object2.method1();
}
单例类在各种应用程序中非常有用,包括日志记录、线程池、配置设置、缓存、数据库应用程序等。
在 Java 中使用各种方法使用单例类
在 Java 编程中编写单例类有多种方法,计算机程序员可以从中选择。但是所有方法都属于以下单例类的任何一种设计模式。
- 延迟初始化
- 早期初始化
对于我们在编写单例类时使用的任何方法,都应考虑以下因素。
-
类的构造函数必须是
private
。 -
单例类必须有一个
静态
方法来返回这个(单例)类实例。
使用延迟初始化方法的 Java 单例类
示例代码(Singleton.java
):
class Singleton {
private static Singleton object = null;
public String message;
private Singleton(){
message = "Hi I live in the Singleton class";
}
public static Singleton getInstance(){
if (object == null)
object = new Singleton();
return object;
}
}
示例代码(Test.java
):
public class Test {
public static void main(String args[]){
Singleton obj1 = Singleton.getInstance();
Singleton obj2 = Singleton.getInstance();
Singleton obj3 = Singleton.getInstance();
System.out.println("Hashcode of obj1 is "
+ obj1.hashCode());
System.out.println("Hashcode of obj2 is "
+ obj2.hashCode());
System.out.println("Hashcode of obj3 is "
+ obj3.hashCode());
if (obj1 == obj2 && obj2 == obj3) {
System.out.println("Three instances reference to the same memory location");
}else {
System.out.println("All are not referencing to the same memory location");
}
}
}
输出:
Hashcode of obj1 is 1490180672
Hashcode of obj2 is 1490180672
Hashcode of obj3 is 1490180672
Three instances reference to the same memory location
在此方法中,仅在需要时创建类对象。使用这种方法,我们可以避免对 Singleton.java
类进行不必要的实例化。
在 Singleton.java
类中,我们创建了该类的 private static
对象(实例),但不对其进行初始化。然后,我们编写一个 private
构造函数,确保没有其他类可以调用其默认构造函数(public
)来创建对象。
最后,我们编写了一个 static
方法来检查 Singleton.java
类的实例,如果它是 null
,它只创建这个类的实例。在 Test.java
类中,我们可以通过创建不同的对象来确认,以确保每次只创建和调用一个实例。
使用早期初始化方法的 Java 单例类
示例代码(Singleton.java
):
class Singleton {
private static final Singleton object = new Singleton();
public String message;
private Singleton(){
message = "Hi I live in the Singleton class";
}
public static Singleton getInstance(){
return object;
}
}
示例代码(Test.java
):
public class Test {
public static void main(String args[]){
Singleton obj1 = Singleton.getInstance();
Singleton obj2 = Singleton.getInstance();
Singleton obj3 = Singleton.getInstance();
System.out.println("Hashcode of obj1 is "
+ obj1.hashCode());
System.out.println("Hashcode of obj2 is "
+ obj2.hashCode());
System.out.println("Hashcode of obj3 is "
+ obj3.hashCode());
if (obj1 == obj2 && obj2 == obj3) {
System.out.println("Three instances reference to the same memory location");
}else {
System.out.println("All are not referencing to the same memory location");
}
}
}
输出:
Hashcode of obj1 is 1490180672
Hashcode of obj2 is 1490180672
Hashcode of obj3 is 1490180672
Three instances reference to the same memory location
在 Singleton.java
类中,我们创建该类的 private static final
实例并对其进行初始化。然后,我们编写一个 private
构造函数和一个静态方法来返回这个类的实例。
请记住,Signleton.java
类实例将在加载时创建。我们还可以将类的实例设置为 public static final
而不是 private static final
,以直接访问该类。
此外,我们有相同的 Test.java
类,它打印并确保每次只调用一个实例。
相关文章
如何在 Java 中延迟几秒钟的时间
发布时间:2023/12/17 浏览次数:217 分类:Java
-
本篇文章主要介绍如何在 Java 中制造程序延迟。本教程介绍了如何在 Java 中制造程序延时,并列举了一些示例代码来了解它。
如何在 Java 中把 Hashmap 转换为 JSON 对象
发布时间:2023/12/17 浏览次数:187 分类:Java
-
它描述了允许我们将哈希图转换为简单的 JSON 对象的方法。本文介绍了在 Java 中把 Hashmap 转换为 JSON 对象的方法。我们将看到关于创建一个 hashmap,然后将其转换为 JSON 对象的详细例子。
如何在 Java 中按值排序 Map
发布时间:2023/12/17 浏览次数:171 分类:Java
-
本文介绍了如何在 Java 中按值对 Map 进行排序。本教程介绍了如何在 Java 中按值对 Map
进行排序,并列出了一些示例代码来理解它。
如何在 Java 中打印 HashMap
发布时间:2023/12/17 浏览次数:192 分类:Java
-
本帖介绍了如何在 Java 中打印 HashMap。本教程介绍了如何在 Java 中打印 HashMap 元素,还列举了一些示例代码来理解这个主题。
在 Java 中更新 Hashmap 的值
发布时间:2023/12/17 浏览次数:146 分类:Java
-
本文介绍了如何在 Java 中更新 HashMap 中的一个值。本文介绍了如何在 Java 中使用 HashMap 类中包含的两个方法-put() 和 replace() 更新 HashMap 中的值。
Java 中的 hashmap 和 map 之间的区别
发布时间:2023/12/17 浏览次数:79 分类:Java
-
本文介绍了 Java 中的 hashmap 和 map 接口之间的区别。本教程介绍了 Java 中 Map 和 HashMap 之间的主要区别。在 Java 中,Map 是用于以键值对存储数据的接口,
在 Java 中获取用户主目录
发布时间:2023/12/17 浏览次数:218 分类:Java
-
这篇文章向你展示了如何在 Java 中获取用户主目录。本教程介绍了如何在 Java 中获取用户主目录,并列出了一些示例代码以指导你完成该主题。
Java 中 size 和 length 的区别
发布时间:2023/12/17 浏览次数:179 分类:Java
-
这篇文章教你如何知道 Java 中大小和长度之间的区别。本教程介绍了 Java 中大小和长度之间的区别。我们还列出了一些示例代码以帮助你理解该主题。
Java 中的互斥锁
发布时间:2023/12/17 浏览次数:111 分类:Java
-
了解有关 Java 中互斥锁的一切,在计算机科学领域,互斥或互斥被称为并发控制的属性。每台计算机都使用称为线程的最小程序指令序列。有一次,计算机在一个线程上工作。为了更好地理解,