在OO Languages中初始化对象属性的最佳实践

时间:2011-12-07 15:13:00

标签: java oop variables nullpointerexception

这个问题略微强调Java,但适用于任何OO语言。 在声明中初始化类变量是一种好习惯吗?对我来说这似乎是显而易见的。它最大限度地降低了愚蠢的空指针异常错误的风险。

例如:

class myClass{

   private String name = "";// initialize here

   public myClass(){

    //something

   }
}

但是在一些教科书中,他们并不打算直接进行初始化。哪个更好?这有关系吗?

3 个答案:

答案 0 :(得分:6)

最好不要初始化内联的一种情况是,您有多个构造函数以不同方式初始化字段。在声明中初始化字段然后用稍后传递给特定构造函数的值替换该值是低效的。

答案 1 :(得分:3)

这已在SO上反复出现,因此您应该在网站上搜索更多意见。

我对Java的建议(这在某些语言中才有意义):

如果该类的初始值是固定的,则初始化内联。

如果不同的构造函数设置了不同的初始值,请在相应的构造函数中指定值。

在C ++ 11中,情况有些类似。

答案 2 :(得分:0)

这完全取决于课程的使用方式。

一个例子是值类,您可能经常希望它是不可变的。理想情况下,在这种情况下,您可以在构造函数中设置值。

public final class Foo {
    private final String foo;
    public Foo(String foo) {
        this.foo = foo;
    }
}

如果有真正合理的默认值,那么您可以在声明时提供这些值。它确实使得很容易看出预期的默认值是多少。 当然,这不适用于最终字段(如上所述),因为无法分配其他值。

另一个考虑因素是构造函数或mutator初始化的相对优点。使用构造函数初始化可确保实例永远不会处于不一致状态,而mutator初始化通常更灵活,并提供更简单的API。

在关于避免NPE的初步评论中,我会说最好通过使用构造函数初始化来处理,沿着上面的代码行。