在Java中初始化对象的数组/向量的最简单方法

时间:2014-04-07 13:25:11

标签: java arrays vector initialization

Java中最简单的方法是创建一个指定大小的数组/列表/向量,其中填充了使用默认构造函数创建的类的实例(我希望这个术语在C ++之外使用吗?)。我想让代码更具可读性并降低NullPointerException的风险。

(例如,ArrayList构造函数有一个带容量参数的构造函数,而不是size ..)

以下是在代码中尝试实现的内容。这是您的典型方法。 (也可以使用Vector或ArrayList完成)

// Typical, I don't want this
class SomeSimpleClass {

    DataClass[] data = new DataClass[10];

    SomeSimpleClass() {
        // I don't want this..
        for(int i = 0; i < 10; i++) data[i] = new DataClass();
    }

    void doSomething() {
        data[5].doSomething();
    }

}

// What I want
class SomeSimpleClass 

    // now I have ten data objects, ready to be used...
    Holder<DataClass> data = new Holder<DataClass>(10);

    void doSomething() {
        data.get(5).doSomething();
    }

}

我发现我的很多类都需要一些较小的数据保存类实例。上面的例子很简单,但当课程变得更复杂时,这可能是一个真正的麻烦。

这里最好的方法是什么?是否有一些持有人类如上所述?是否有ArrayList(或类似类)的函数,如下所示?

ArrayList<DataClass> data = new ArrayList<DataClass>().addNewObjects(10);

4 个答案:

答案 0 :(得分:3)

从Java 8开始,您可以使用类似

的内容
Stream.generate(DataClass::new).limit(10).toArray(DataClass[]::new);

但我没看到

DataClass[] data = new DataClass[10];
for(int i = 0; i < data.length; i++) data[i] = new DataClass();

糟糕的做法。

您也可以使用Arrays.setAll

DataClass[] data = new DataClass[10];
Arrays.setAll(data, i -> new DataClass());

顺便说一句,如果您不需要同步方法,请不要使用Vector,而要List使用ArrayList

创建ArrayListDataClass元素的Java 8代码可能看起来像

Stream.generate(DataClass::new).limit(10).collect(Collectors.toList());

如果你确实需要Vector,那么只需使用返回的列表并将其传递给Vector构造函数。

答案 1 :(得分:1)

实际上,当且仅当您需要时,才应创建/初始化对象。假设您创建了一个对象数组,并且每个索引最初都包含一个(对象)引用,那么您的api用户可能会感觉到该数组中存储了实际数据。但事实是,你有一堆无处不在的冗余引用,因此没有引发NpE。这可能会产生一些问题,其中NpE会清楚地表明&#34; nothin in here&#34;

答案 2 :(得分:1)

您可以像这样编写自定义扩展名到ArrayList:

public class MyGeneratingArrayList<T> extends ArrayList<T> {
    public MyGeneratingArrayList(int count, Class<T> clazz) throws InstantiationException, IllegalAccessException {
        super(count);
        for (int i = 0; i < count; i++) {
            super.add(clazz.newInstance());
        }
    }
}

clazz部分并不完美,但如果你不想深入思考反思,你将不得不处理这个问题。 This post也可能对您感兴趣。

答案 3 :(得分:0)

您可以在数组上使用Arrays.fill(),但我想在这种情况下每个项目都指向同一个对象。

如果你想要不同的实例,那么你必须坚持使用AFAIK:

for(int i = 0; i < 10; i++) data[i] = new DataClass();