静态变量初始化
今天我与同事讨论并得出以下几点。 如果一切正确或需要进行一些修改,请点亮一些光。
- 如果未在类中定义静态构造函数,则在使用静态字段之前对其进行初始化。
- 当在类中定义静态构造函数时,静态字段在其使用之前或作为(之前)实例创建的一部分初始化。
- 如果在静态方法中没有访问静态字段并且调用静态方法。 只有在该类中定义了静态构造函数时,才会初始化静态字段。
- 如果可能的话,应该避免在类中使用静态构造函数。
1.-3。你不能确切知道它何时发生,所以你不能依赖它。 静态构造函数可以让您稍微控制调用它时会发生什么。
public class UtilityClass { // // Resources // // r1 will be initialized by the static constructor static Resource1 r1 = null; // r2 will be initialized first as static constructors are // invoked after the static variables are initialized static Resource2 r2 = new Resource2(); static UtilityClass() { r1 = new Resource1(); } static void f1(){} static void f2(){} }
4.静态构造函数很慢
静态构造函数执行的确切时间取决于实现,但遵循以下规则:
- 类的静态构造函数在创建类的任何实例之前执行。
- 类的静态构造函数在类的任何静态成员之前执行
引用。 - 类的静态构造函数在类的静态字段初始值设定项(如果有)之后执行。
- 在单个程序实例化期间,类的静态构造函数最多执行一次。
- 两个静态构造函数之间的执行顺序
没有指定不同的类。
你的所有观点都是正确的。
应避免使用静态构造函数的原因是因为编译器会在调用类的任何方法的任何地方注入代码,以检查是否已调用静态构造函数。 这会对性能产生负面影响。
你可以做的是在你的类中有一个私有静态字段,当调用默认(或其他非静态)构造函数时,该字段被赋予一个虚拟值。 这将初始化对象创建时的所有静态字段。