单身的私人构造函数

时间:2017-01-10 20:24:04

标签: java design-patterns singleton

 public class DBSingleton {

 private static DBSingleton instance = new DBSingleton();

 private DBSingleton() {
 // why do we need this constructor
 }
 public static DBSingleton getInstance() {
     return instance;
 }
}

私人构造函数如何帮助我?

我的意思是所有变量和方法都是静态的,即使我将构造函数公开,它也不会改变任何东西 让我们说有人创建我的单例对象什么都不会发生,因为这个类中的所有内容都是静态的,这意味着与类本身而不是对象相关联。 Java静态属性共享给所有对象。

请有人给我合理的例子吗

2 个答案:

答案 0 :(得分:0)

您需要一个私有构造函数来阻止用户实例化您的类。

如果您将构造函数设为公开,则用户可以执行DBSingleton singleton = new DBSingleton(),您的课程将不会是单身人士!

答案 1 :(得分:0)

单例类(编辑:与单例实例进行比较 - 参见注释)甚至不一定需要实例化;它足以给它一个私有构造函数并声明所有其他方法是静态的,强制用户在类上调用它们。

构造函数必须是私有的,以确保类是单例,无论您是否创建它的单个实例。如果没有声明私有构造函数,Java会自动为它提供一个公共的无参数构造函数。

这个类可能是一个单独的实例,大概是为了安全,也就是说,如果你想调用它上面的方法,就像那个单例所说的那样。如果你有一个类的实例没有明确地成为一个单例,那么当你调用它运行单例实现的方法时,并不能保证,因为你实际上可能有一个DBSingleton的子类,其中所述方法被覆盖。 (如果您将其作为DBSingleton.someMethod()调用,您当然会得到预期的行为,但如果您这样做:

DBSingleton dbsInstance = DBSingleton.getInstance();
// ... all sorts of code, some of which might affect dbsInstance
dbsInstance.someMethod();
所有投注都已关闭。)

声明一个类以避免其他实例的更合适的方法是将其声明为final。你给它一个私有的构造函数,以便它也无法实例化。 (最终类或具有私有构造函数的类(或者更确切地说,零非私有构造函数)足以使类不可重写。)