成员应该在类或构造函数中初始化吗?

初始化变量,特别是类级别的对象引用是一个好习惯吗? 请考虑以下示例;

public class MyClass { private static MyObject myObject; public static void main(String[] args) { myObject = new MyObject(); } } 

要么

 public class MyClass { private MyObject myObject = new MyObject(); public static void main(String[] args) { // Other code } } 

哪种方式最好? 请指导我们两者的利弊。

问候。

通常,延迟实例化(第一个片段)是首选,因为对象具有(可能)更短的生命周期。 您应该支持尽可能短的对象生命周期。

根据我的个人经验,所有关于对象创建的成本或详细程度。 其次,您还可以将其视为懒惰创建与主动创建。 如果只涉及构造函数,我通常会在实例变量级别创建对象。 如果有进一步的调用来初始化有问题的成员,那么肯定会将调用移动到构造函数或需要初始化的方法。

这就是为什么使用工厂方法模式,将实际的对象创建委托给另一个类。

这取决于您希望每个字段具有的范围,以及您希望方法具有的内存占用量。 在类级别声明字段时,将在运行时为字段初始化内存区域。 当您在方法级别声明它们时,在执行时为这些字段需要和初始化的内存,然后在方法完成时,内存被标记为垃圾收集。 在方法级别,类的内存占用可能会根据需要缩小和增长。 如果从未调用过该方法,那么您真的需要这些字段始终可用吗?

我发现类级别字段适用于您想要static final ,或未更改且不可更改的任何内容。 可以说不一定是全局变量,但非常接近它。 除非您正在创建一个作为数据传输对象的类,否则您希望可见或必须初始化的所有内容都将处于类级别。 方法级别字段适用于临时执行计算所需的操作。

请注意,尽管将对象初始化为null,但所有内容都在java中初始化。

您通常希望尽早失败(空指针exception),因此您不希望初始化为组合/任意值,因此我想说在大多数情况下不会初始化,除非您知道在创建外部类时应该是什么值时间。

除非是单身,否则初始化没有意义。 您可能想要一个带有构造函数或setter的新实例。

你也可以尝试这个….

公共类MyClass {

 private static MyObject myObject; public static void main(String[] args) { if(myObject == null) { myObject = new MyObject(); //this will check ..... IMP } } 

}