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);
答案 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
。
创建ArrayList
个DataClass
元素的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();