我有一个类,其中包含另一个对象(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
值。
答案 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;
}