引用由其构造函数创建的另一个对象中的对象的字段

时间:2014-06-30 01:47:22

标签: java arraylist constructor nullpointerexception

对象创建者

ObjectCreator.java

import java.util.ArrayList;
import java.util.List;

class ObjectCreator {

    List<CreatedObject> objects;
    static ObjectCreator objectCreator;

    public ObjectCreator() {
        objects = new ArrayList<CreatedObject>();
        CreatedObject createdObject = new CreatedObject(9); //second object
    }

    public static void main(String[]args) {
        objectCreator = new ObjectCreator(); //first object
    }
}

创建的对象

CreatedObject.java

class CreatedObject {

    public CreatedObject() {
        ObjectCreator.objectCreator.objects.add(this); //adds itself
                                                       //nullpointer here
    }
}

以上是我的问题的例证。我在行ObjectCreator.objectCreator.objects.add(this);处得到一个nullpointer异常,因为objectCreator(在ObjectCreator类中)为null。我相信这是因为objectCreator的构造函数(在类ObjectCreator中)尚未结束,因此该对象未被赋予值。

在我的实际程序中,我有一个负责根据算法创建对象的类。该算法通过类的构造函数参数提供信息。在构造函数的最后,我想要有多个(非静态)ArrayLists,每个ArrayLists都填充了对已创建的每种类型的所有不同对象的引用。我希望这些对象在它们的构造函数中将自己添加到ArrayList中。即object1 creates object2 creates object3 adds itself to ArrayList stored in object1这种方法显然证明是无用的。

问题:如何以干净有效的方式实现这些结果(ArrayLists填充了在ObjectCreator类的构造函数中创建的对象)?这似乎是一个非常基本的功能,在许多程序中都是必要的,所以它是如何完成的?

2 个答案:

答案 0 :(得分:0)

问题在于访问该静态字段。 main中的赋值在构造函数完成之后才会发生,但您正在尝试在内部类构造函数中读取它。

如果您要使用内部(非静态)类,只需使用封闭类的实例列表。

答案 1 :(得分:-1)

您可以调用静态字段,这意味着不会调用构造函数。

ObjectCreator.objectCreator.objects.add(this);

您可以在类中初始化静态字段:

static ObjectCreator objectCreator = new ObjectCreator();