【问题标题】:Is the DriverManager class a Singleton in Java?DriverManager 类是 Java 中的单例吗?
【发布时间】:2023-03-11 02:45:01
【问题描述】:

来自this 来源我读到:

您可能有使用 JDBC 驱动程序的经验。例如, classloader 尝试加载和链接 Driver 类 “org.gjt.mm.mysql”包。如果成功,静态初始化器是 调用。

Class.forName("org.gjt.mm.mysql.Driver"); 
Connection con = DriverManager.getConnection(url,"myLogin", "myPassword"); 

让我们看看为什么需要 Class.forName() 将驱动程序加载到内存中。所有 JDBC 驱动程序有一个向 DriverManager 注册自身的静态块 并且 DriverManager 只有静态初始化器。

MySQL JDBC 驱动程序有一个静态初始化器,如下所示:

 static {
     try {
         java.sql.DriverManager.registerDriver(new Driver());
     } catch (SQLException E) {
         throw new RuntimeException("Can't register driver!");
     } }

这是否意味着 DriverManager 是一个单例类?

【问题讨论】:

  • 为什么你认为它可能是单例?
  • 好吧,因为我正在向某个类注册一个类类型,那么当我从我注册到的类中添加一个 stati 方法时,它会被使用吗?没有它的例子。都是静态的。
  • static != singleton.
  • Java中没有静态类?
  • 实际上,不,没有,除非您在谈论嵌套类。但这与本次讨论无关。要了解 Singleton Java 类的外观,请参见此处:javacoffeebreak.com/articles/designpatterns

标签: java singleton


【解决方案1】:

这不是单例。它是一个纯实用程序类,只有静态方法。该类有 0 个实例。单例将拥有该类的一个实例,并且您可以访问该实例以调用其上的实例方法。

Java 已记录在案,并且是开源的。您可以查看该类的源代码以了解其工作原理。

【讨论】:

  • 谢谢,我从未听说过实用程序类。如果没有实例,驱动怎么注册?
  • 类在静态变量中维护其状态。
  • @KorayTugay 它有static 状态。 (全局变量,-ish。)
  • 搜索实用程序类会弹出几乎exact same 示例。
  • @MiserableVariable 谢谢,但是当我搜索 DriverManager 时,相反的方法不起作用。
猜你喜欢
  • 2023-03-08
  • 2023-03-13
  • 2012-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-21
  • 2014-03-10
相关资源
最近更新 更多