2012-03-29 132 views
3

我有一个类,里面保存着另一个对象(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值生成的,但可能会发生错误,对象仍然。

回答

2

是的,这是一个很好的做法。构造函数是实例化成员对象的自然场所。您还可以创建他们的权利,他们的声明:

private List l = new ArrayList(); 

但是,它可能是一个好主意,其中的方法是为了以重组或使NullPointerException旨意不会出现修改代码,无论调用。

+0

所有答案都不错,但这是因为修改代码以避免NullPointerException而选择的,我完全同意这一点。 – 2012-03-29 22:55:07

1

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

1

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

希望这对你有所帮助。

1

通常是好做法实例成员字段(无论是对象或原语)在创建时当默认值(0,false或null)是不是你想要的。有一次推迟这是懒惰的实例化。 (例如,当一个对象可能不再需要而且创建它时代价昂贵时,就会使用它。)推迟这个的另一个时间是需要事先进行其他初始化的时候。

假设你想在初始化对象创建时间的字段,有两种方法可以做到这一点:与初始化表达式为你显示或在构造函数(或多个)。没有太多的区别,除了该实例初始化器在构造函数的第一行之前运行。这可能会或可能不会导致问题,具体取决于您的代码逻辑。

无论何时在对象创建时初始化成员字段final并且预期在对象的生命期内不会更改,也是一个好主意。声明字段final的一个好处是编译器会捕获任何初始化它的失败。 (编译器需要明确的分配以考虑final字段被正确初始化。)

1

您正在谈论渴望建设与懒惰建设。有些地方每个人都有价值。

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

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

1

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


您也可以将某些默认状态 - 就像Collections.emptyList(),或 在常量类:

DEFAULT_STATE = new SomeState(); 

然后只需

class A { 
     State obj = Constants.DEFAULT_STATE; 
    }