静态构造函数和私有构造函数有何不同
本文关键字:构造函数 何不同 静态 | 更新日期: 2023-09-27 18:06:02
静态构造函数和私有构造函数有什么不同?
public class WorkstationDevicePresenter
{
private WorkstationDevicePresenter()
{}
}
留空有什么意义?
留空有什么意义?
创建"blank"构造函数的原因有很多。
您可以创建一个空构造函数,因为您希望在调试期间有一个地方设置断点。
可以创建一个空白的静态构造函数,因为这样做会改变静态字段初始化式的语义。请阅读Jon关于这个主题的文章了解详情。
让我们撇开静态构造函数,考虑空白的实例构造函数。
激发空白构造函数的关键规则是:默认情况下,如果类型中没有构造函数,那么您将免费获得一个"空白"无参数公共构造函数。如果类型中有任何构造函数,则不会免费获得空白的无参数公共构造函数。
所以你想要一个空构造函数的第一个明显的原因是:我想要一个空的无参数构造函数,但是我已经创建了另一个函数,所以我不再免费获得一个。
第二个原因是你没有任何变量,你不想要一个空的无参数的public构造函数。您可能需要一个空白的无参数私有的、内部的或受保护的构造函数。如果这是你想要的,那么你必须自己做一个。特别地,将空私有变量作为唯一的变量意味着不能通过类外部的构造函数实例化类。如果您想使用工厂模式,这是非常有用的。它还可以防止类外部的代码生成派生类,因为派生类必须能够调用构造函数。如果所有构造函数都是私有的,那么它们就不能派生。
我经常在工厂模式中使用这种变体:
public abstract class Thing
{
private Thing() {}
private class RedThing : Thing { ... }
public static Thing GetRedThing() { return new RedThing(); }
}
看,通过创建一个私有构造函数,我可以创建一个公共抽象类,它只能由我的代码实例化,只能由我的代码扩展,因此我有一个很好的不变量:每次我看到一个类型为Thing
的对象,我就知道它来自哪里。
静态构造函数在类加载时发生一次,私有构造函数在被一些通常用于创建单例的公共静态方法调用时发生,或者使用Builder模式。没有理由有一个空白的私有构造函数(据我所知)。
静态构造函数初始化类的静态部分,私有构造函数只能由类本身使用,例如创建类的单例对象。
public class MyClass {
private static int staticitem;
private int instanceitem;
static MyClass(){
staticitem = 0; //define value for staticitem
}
private MyClass() { //can only be called from within the class
instanceitem = 0; //define value for instanceitem
}
public static MyClass GetMyClass() {
MyClass m = new MyClass();
return m;
}
}
空白私有构造函数将使类不能被除自身之外的任何对象实例化。如果没有这段代码,默认情况下编译器会创建一个空白的public无参数构造函数。
静态构造函数在创建静态实例时调用。
你可以使用两者来创建一个Singleton模式,例如。
检查以下代码:
public class Singleton
{
public static Singleton Instance;
static Singleton
{
Instance = new Singleton();
}
private Singleton()
{
}
}
public class SomeOtherClass
{
public static Singleton CompileError = new Singleton();
public static Singleton CompileOK = Singleton.Instance;
}