我正在尝试进行代码分析,并注意到下面的代码片段中有一个没有参数的构造函数(私有)。这整个代码背后的目的是什么?
public class Wit {
public static Wit instance = null;
private Wit() {
}
public static Wit getInstance() {
if (instance ==null){
instance = new Wit();
}
return instance;
}
}
答案 0 :(得分:2)
这是在singleton pattern之后,它确保一个类只能通过使其默认构造函数为private并在内部处理实例化而只有一个实例。
但是,在您的示例中,通过公开非最终instance
变量来破坏单身保证。任何人都可以将引用设置为null,从而导致在下次调用getInstance()
时创建另一个实例。
答案 1 :(得分:1)
在开始时你正在关注构造函数是件好事。
让我们快速浏览几点。
1。需要构造函数来创建类的对象/实例。
2. 如果您自己没有定义构造函数,则会自动创建一个默认的无参数公共构造函数。
3. 如果您确实定义了构造函数,则不会创建默认构造函数。
4. 在您的示例中,Wit类具有私有构造器,其具有两个含义:
A。不会创建默认构造函数(这意味着私有Wit()是您的类Wit唯一的构造函数)
B. 由于您的类只有构造函数,因此私有构造函数和私有成员只能通过类中的代码调用,类的对象只能从类Wit中创建。在您的情况下,这是通过调用getInstance方法完成的。
最后因为Wit将instance和getInstance()成员作为静态并且在getInstance()中,所以只有在实例为null(即没有指向)时才放入代码来创建新实例你的类已经实现了单例模式。
修改: ===== 强>
在某些情况下,会绕过构造函数调用创建对象。几个例子是克隆和反序列化。但深入研究这些主题超出了这个问题的范围。
答案 2 :(得分:0)
要添加现有答案,我已经获得了使用私有构造函数
的一些好处您可以控制为特定类创建的实例数。 (参考:有效的Java)。使用私有构造函数,没有人可以创建类的实例,并且实例是从工厂方法分发的。这允许我们保持共享实例的数量或分发类的现有实例。我们可以控制实例创建。
私有构造函数对于实现不变性非常有用。当有人继承该类时,默认调用父的默认构造函数,即super();
。 。现在假设任何人都试图扩展你的类,这是不可能的,因为你的默认构造函数是私有的。这将使编译时间本身失败。
当我们需要编写像java.lang.Math
这样只包含效用静态方法的Utility类时,我们也将构造函数设为私有。目的是通过明确的消息将其用作实用程序。