Java 单例类

在 Java 中,单例模式是一种设计模式,它确保一个只能有一个对象。

要创建一个单例类,一个类必须实现以下属性:

  • 创建类的 `private` 构造函数,以限制在类外部创建对象。
  • 创建该类的 `private` 属性,用于引用单个对象。
  • 创建一个 `public static` 方法,允许我们创建和访问我们创建的对象。在该方法内部,我们将创建一个条件来限制我们创建的对象不超过一个。

示例:Java 单例类语法

class SingletonExample {

   // private field that refers to the object
   private static SingletonExample singleObject;
                                              
   private SingletonExample() {
      // constructor of the SingletonExample class
   }

   public static SingletonExample getInstance() {
      // write code that allows us to create only one object
      // access the object as per our need
   }
}

在上面的例子中:

  • private static SingletonExample singleObject - 对类对象的引用。
  • private SingletonExample() - 一个私有的构造函数,限制在类外部创建对象。
  • public static SingletonExample getInstance() - 此方法返回对类唯一对象的引用。由于该方法是 static 的,因此可以使用类名访问它。

Java 中单例的用途

单例可用于处理数据库。它们可用于创建连接池以访问数据库,同时为所有客户端重用相同的连接。例如,

class Database {
   private static Database dbObject;

   private Database() {      
   }

   public static Database getInstance() {

      // create object if it's not already created
      if(dbObject == null) {
         dbObject = new Database();
      }

       // returns the singleton object
       return dbObject;
   }

   public void getConnection() {
       System.out.println("You are now connected to the database.");
   }
}

class Main {
   public static void main(String[] args) {
      Database db1;

      // refers to the only object of Database
      db1= Database.getInstance();
      
      db1.getConnection();
   }
}

当我们运行程序时,输出将是:

You are now connected to the database.

在我们上面的示例中,

  • 我们创建了一个单例类 Database
  • dbObject 是一个类类型的字段。它将引用 Database 类的对象。
  • 私有构造函数 `Database()` 可防止在类外部创建对象。
  • 静态类类型方法 `getInstance()` 将类的实例返回给外部世界。
  • Main 类中,我们有一个类类型变量 db1。我们正在使用 db1 调用 `getInstance()` 来获取 Database 的唯一对象。
  • `getConnection()` 方法只能使用 Database 对象访问。
  • 由于 Database 只能有一个对象,因此所有客户端都可以通过单个连接访问数据库。

单例是一种设计模式,而不是 Java 特有的功能。设计模式就像我们的代码库,包含了世界各地程序员共享的各种编码技术。


值得注意的是,只有少数场景(例如日志记录)使用单例模式才有意义。如果您不确定是否要使用单例模式,我们建议您完全避免使用它们。了解更多:单例有什么不好之处?

你觉得这篇文章有帮助吗?

我们的高级学习平台,凭借十多年的经验和数千条反馈创建。

以前所未有的方式学习和提高您的编程技能。

试用 Programiz PRO
  • 交互式课程
  • 证书
  • AI 帮助
  • 2000+ 挑战