在初始化中实例化对象?

时间:2012-03-29 22:26:09

标签: java null

我有一个类,其中包含另一个对象(List,Set和我的应用程序中的对象)。

public class SomeClass {
    private List l;
    private SomeObject obj;
    //...
}

一个好的做法是实例化创建SomeClass对象的这些对象以避免NullPointerException吗?类似的东西:

public class SomeClass{
    private List l = new ArrayList();
    private SomeObject obj = new SomeObject();
    //...
}

以正常方式,这些对象将在某些处理/分析中生成,但可能会发生错误,对象仍然具有null值。

6 个答案:

答案 0 :(得分:2)

是的,这是一个很好的做法。构造函数是实例化成员对象的自然场所。您也可以在声明它们的位置创建它们:

private List l = new ArrayList();

但是,重新构建或修改代码可能是个好主意,这样无论调用方法的顺序如何都不会发生NullPointerException

答案 1 :(得分:1)

如果该类的空List或默认对象在每个后续操作中都是有效状态,则是,实例化默认值。但是,如果默认状态为无效状态,请不要这样做。

答案 2 :(得分:1)

我更喜欢初始化,因为有时候很难找到空指针异常的位置,如果你用构造函数初始化你的对象,那么应该初始化里面的对象。

希望这对你有所帮助。

答案 3 :(得分:1)

通常,只要默认值(0,false或null)不是您想要的,就可以在创建时实例化成员字段(无论是对象还是基元)。一次推迟这是懒惰的实例化。 (例如,当一个对象可能根本不需要而且创建它很昂贵时就会使用它。)另一个推迟这个的时候是需要事先进行其他初始化。

假设您想在对象创建时初始化字段,有两种方法可以实现:使用您显示的初始化表达式或在构造函数中。除了实例初始化程序在构造函数的第一行之前运行之外,没有太大的区别。这可能会也可能不会导致问题,具体取决于您的代码逻辑。

在创建对象时初始化成员字段final并且在对象的生命周期内不会发生变化时,声明成员字段final也是一个好主意。声明字段final的一个附带好处是编译器将捕获任何初始化它的失败。 (编译器需要明确赋值才能考虑正确初始化{{1}}字段。)

答案 4 :(得分:1)

你在谈论急切的建筑与懒惰的建筑。有些地方每个都有价值。

在许多情况下,最好懒得创造东西,因为它可以节省内存。但是每次尝试获取数据时都必须检查null

在某些情况下,有必要预先创建对象,以避免上面提到的空检查或避免在密集过程中命中对象创建时间

答案 5 :(得分:1)

像这样生成它们是正常的,但是为了避免NPE而生成它们并不是一种很好的编码方式。应该在代码中进行适当的验证,而不是分配不会被利用的符合垃圾的对象。


您还可以指定一些默认状态 - 例如Collections.emptyList()或   在常量类中:

DEFAULT_STATE = new SomeState();

然后简单地

class A { 
      State obj = Constants.DEFAULT_STATE;
   }
相关问题