Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在初始化中实例化对象?_Java_Null - Fatal编程技术网

Java 在初始化中实例化对象?

Java 在初始化中实例化对象?,java,null,Java,Null,我有一个类,其中包含另一个对象(我的应用程序中的列表、集合和对象) 在创建SomeClass对象以避免NullPointerException的地方实例化这些对象是否是一个好的做法?比如: public class SomeClass{ private List l = new ArrayList(); private SomeObject obj = new SomeObject(); //... } 在正常情况下,这些对象将在某些处理/分析中生成,但可能会发生错误,

我有一个类,其中包含另一个对象(我的应用程序中的列表、集合和对象)

在创建
SomeClass
对象以避免NullPointerException的地方实例化这些对象是否是一个好的做法?比如:

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

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

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

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

private List l = new ArrayList();

但是,重新构造或修改代码可能是一个好主意,这样无论调用方法的顺序如何,都不会发生
NullPointerException
s。我更喜欢初始化,因为有时很难找到null指针异常的位置,如果你用构造函数初始化你的对象,里面的对象应该被初始化


希望这对您有所帮助。

当默认值(0、false或null)不是您想要的值时,通常最好在创建时实例化成员字段(对象或原语)。延迟此操作的一次是延迟实例化。(例如,当一个对象可能根本不需要并且创建它的成本很高时,就使用这种方法。)另一个延迟时间是当需要事先进行其他初始化时

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


当成员字段在对象创建时初始化并且在对象的生命周期内不会更改时,最好声明成员字段
final
。声明字段
final
的一个附带好处是,编译器将捕获初始化它的任何失败。(编译器需要明确的赋值来考虑<代码>最终字段被正确初始化。)< /P> < p>你正在谈论的是渴望结构和懒惰结构。在有些地方,每一个都有价值

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


在某些情况下,提前创建对象是有意义的,或者是为了避免上面提到的空检查,或者是为了避免在密集的过程中对象创建时间受到影响,这样生成对象是正常的,但是仅仅为了避免NPE而编写代码来生成对象并不是一种好方法。应该在代码中进行适当的验证,而不是分配不可用的符合垃圾条件的对象


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

DEFAULT_STATE = new SomeState();
然后简单地

class A { 
      State obj = Constants.DEFAULT_STATE;
   }

所有答案都很好,但之所以选择这个选项,是因为它要求修改代码以避免NullPointerException,我完全同意这一点。
class A { 
      State obj = Constants.DEFAULT_STATE;
   }