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

时间:2010-12-10 04:32:55

标签: java

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

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
    }
}

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

问候。

6 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:3)

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

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

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

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

答案 4 :(得分:1)

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

答案 5 :(得分:1)

你也可以尝试这个......

公共类MyClass {

private static MyObject myObject;

public static void main(String[] args) {

    if(myObject == null)
    {
         myObject = new MyObject();         //this will check ..... IMP
    } 
}

}