面向对象编程语言中对象属性的初始化最佳实践

5
这个问题略带重点地涉及Java,但适用于任何面向对象的语言。在声明中初始化类变量是否是一个好习惯?对我来说显然是的。这样可以将愚蠢的空指针异常错误的风险最小化。
例如:
class myClass{

   private String name = "";// initialize here

   public myClass(){

    //something

   }
}

但是在某些教材中,它们并没有立即进行初始化。哪种做法更好?这有关紧要吗?


那不是一个类变量,而是一个实例变量。 - Matt Fenwick
5
NPE(NullPointerException)比值被初始化为不正确或无效的值更糟糕,原因是NPE可以导致程序完全停止运行,而错误的初始化值可能只会导致程序在后续操作中出现问题。 - Mark Rotteveel
1
马克是正确的。与错误的值静默失败相比,NullPointerException更好。 - Steve Kuo
3个回答

6

有时候,最好不要在行内进行初始化,特别是当你有多个构造函数以不同方式初始化字段时。在声明时初始化字段,然后再用特定的构造函数传递的值替换该值会效率低下。


3

这个问题在SO上已经被反复提及,因此您应该搜索该网站以获取更多意见。

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

如果初始值对于类来说是固定的,则在行内进行初始化。

如果不同的构造函数设置了不同的初始值,请在相应的构造函数中分配这些值。

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


0

这完全取决于类的预期使用方式。

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

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

如果有合理的默认值,您可以在声明时提供这些值。这确实使得很容易看到预期的默认值是什么。

当然,对于 final 字段(如上所述),它不能够分配另一个值。

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

在避免 NPE 的初始备注中,我认为最好使用类似上面代码的构造函数初始化来处理。


如果它是最终的,为什么不在您的代码示例中声明它?我经常看到这种情况,对于惯例、代码风格和最佳实践感到困惑。 - Jean-Patrick Smith
@Jean-PatrickSmith 因为最终属性中存储的实际_value_是在运行时提供给构造函数的。如果foo的_value_是内联硬编码的,则只能拥有具有该确切值的Foo实例。我在答案的第三段评论了这一点。 - ptomli

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接