为什么在Singleton类中使用私有Constructor是强制性的

use*_*422 4 java design-patterns

这是我获取数据库连接的单例类.

我在这里有一个问题:为什么必须在单例类中包含一个私有构造函数(在整个应用程序中我只调用一次这个类)并且可以使用静态方法实现类的一个实例?

这个私人构造函数可以避免,还是它是mantadatory?

 public class ConnPoolFactory {
        private static DataSource dataSource;
        private static Connection connection;

        private ConnPoolFactory() {
            System.out.println(" ConnPoolFactory cons is called ");
        }

        public static synchronized Connection getConnection() throws SQLException {

            try {

                if (connection == null) {
                    Context initContext = new InitialContext();
                    Context envContext = (Context) initContext
                            .lookup("java:/comp/env");
                    dataSource = (DataSource) envContext.lookup("jdbc/Naresh");
                    connection = dataSource.getConnection();
                } else {
                    return connection;
                }

            } catch (NamingException e) {
                e.printStackTrace();
            }

            return connection;

        }
    }
Run Code Online (Sandbox Code Playgroud)

Vla*_*lad 18

否则每个人都可以创建一个类的实例,因此它不再是单例.对于单身人员,根据定义,只能存在一个实例.

  • 你永远不知道你的应用程序有什么日子会发生什么.项目可以增长,你将获得更多的开发人员.因此,只要您的项目非常小,并且您可以完全控制它,您就可以以任何您喜欢的方式执行它,但只要项目变得更复杂,您就需要执行规则:"singleton是唯一的" . (5认同)
  • @ user1254422 - 大多数人在有多个人的团队中工作,这就是他们说"其他人"的原因.但是,即使只是你,如果你不小心,也可能意外地创建了多个实例.私有构造函数是一种防止多个实例的安全机制,因为创建实例的唯一方法是通过静态get方法. (2认同)

cHa*_*Hao 6

Singleton模式通常包括非公共构造函数,原因有两个.必须存在构造函数,因为如果根本没有构造函数,则包含公共默认构造函数.但是,如果你有一个公共构造函数,那么人们可以随意制作自己的单身人士(有人不可避免地会这样做,这意味着可以有不止一个).

但它不一定是私人的.事实上,正如我所听到的那样,GoF指定的Singleton模式提到了受保护的构造函数,原因有些奇怪.关于继承的一些事情,我听说,但单身和继承在任何方面都不能很好地发挥作用.

甚至可以拥有一个公共构造函数,只要它可以检测实例是否已经存在并抛出异常或其他内容.这足以保证单一性.但这种情况并不常见,因为通过提供两种明显的方法来获取实例,这样做会使事情变得复杂 - 其中只有一种实际上有效.如果您不希望外部代码能够创建第二个实例,为什么构造函数应该成为公共接口的一部分?


bod*_*odo 6

如果你不需要延迟启动:

public class Singleton {
    private static final Singleton instance = new Singleton();

    // Private constructor prevents instantiation from other classes
    private Singleton() { }

    public static Singleton getInstance() {
            return instance;
    }
}
Run Code Online (Sandbox Code Playgroud)

是最好的方法,因为是线程安全的.


Tyl*_*ong 5

如果没有这样的私有构造函数,Java将为您提供默认的公共构造函数.然后,您可以多次调用此构造函数来创建多个实例.那么它不再是单身人士班了.


Che*_*min 1

这是强制性的。您的代码可能没问题,但其他人可以使用此代码并实例化另一个对象,或者您可能会意外地这样做。这条路很安全。