Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.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中创建一个数组/列表/向量的最简单的方法是用默认构造函数创建的类实例(希望这个术语在C++之外也使用)。我希望使代码更具可读性,并降低NullPointerException的风险_Java_Arrays_Vector_Initialization - Fatal编程技术网

Java中初始化对象数组/向量的最简单方法 在java中创建一个数组/列表/向量的最简单的方法是用默认构造函数创建的类实例(希望这个术语在C++之外也使用)。我希望使代码更具可读性,并降低NullPointerException的风险

Java中初始化对象数组/向量的最简单方法 在java中创建一个数组/列表/向量的最简单的方法是用默认构造函数创建的类实例(希望这个术语在C++之外也使用)。我希望使代码更具可读性,并降低NullPointerException的风险,java,arrays,vector,initialization,Java,Arrays,Vector,Initialization,(例如,ArrayList构造函数的构造函数的参数是容量,而不是大小.) 下面是我们试图在代码中实现的内容。这是您典型的方法。(也可以使用Vector或ArrayList完成) //典型的,我不想要这个 类SimpleClass{ DataClass[]数据=新的DataClass[10]; SomeSimpleClass(){ //我不要这个。。 对于(inti=0;i

(例如,ArrayList构造函数的构造函数的参数是容量,而不是大小.)

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

//典型的,我不想要这个
类SimpleClass{
DataClass[]数据=新的DataClass[10];
SomeSimpleClass(){
//我不要这个。。
对于(inti=0;i<10;i++)数据[i]=newdataclass();
}
无效剂量测定法(){
数据[5]。doSomething();
}
}
//我想要什么
类SimpleClass
//现在我有十个数据对象,随时可以使用。。。
持有人数据=新持有人(10);
无效剂量测定法(){
data.get(5.doSomething();
}
}
我发现我的很多类都需要一些较小的、包含数据的类的实例。上面的示例很简单,但当类变得更复杂时,它可能会成为一个真正的麻烦

这里最好的方法是什么?有没有像上面那样工作的holder类?ArrayList(或类似类)是否有如下函数

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

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

如果您需要不同的实例,那么AFAIK您必须坚持:

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

实际上,只有在需要时才应该创建/初始化对象。假设您创建了一个对象数组,并且每个索引最初都包含一个(对象)引用,那么api的用户可能会感觉到该数组中存储了实际数据。但事实是,你有一堆多余的引用,因为没有NpE被抛出。这可能会产生一些问题,NpE可能会清楚地显示“此处无任何内容”

您可以像这样编写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());
        }
    }
}
公共类MyGeneratingArrayList扩展了ArrayList{
public MyGeneratingArrayList(int count,Class clazz)抛出实例化异常,IllegalAccessException{
超级(计数);
for(int i=0;i

clazz
部分并不完美,但如果你不想深入思考,你就必须解决这个问题。您可能也感兴趣。

因为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();
顺便说一句,如果您不需要同步方法,那么不要使用
Vector
,而是像
ArrayList
那样使用
List

用于创建
DataClass
元素的
ArrayList
的Java 8代码可以如下所示

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

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

如果您有一个数独单元格网格,需要以相同的方式初始化,该怎么办?您需要9x9个不同的对象,可以随时使用(由用户填写),并且默认构造函数可以正确初始化所有单元格,使它们成为实际数据,即使它们包含相同的数据。一些语法糖可以很好地避免循环,尽管我对循环很满意^^^这是一个非常特殊的情况。您可以在项目中创建这样一个多重初始值设定项。但由于我的解释,jdk中没有类似的东西。这是一个有趣的评论,但通常主要是关于组织类变量,并使它们“可循环”。考虑类三角形{浮游子x0,y0,x1,y1,x2,y2;}与类三角形{点角[],} iFLULL,我不确定它是具体的。我遇到过几种情况,在这些情况下,我需要一个对象数组,它不需要比普通构造函数更多的初始化。但我实际上需要的是实例,而不是准备由
new
@user2582805填充的引用。如果是三角形,我认为不需要将3个点初始化为(0,0,0),这没有多大意义。您可能对正在创建的三角形有所了解,因此应该相应地初始化顶点。
DataClass[] data = new DataClass[10];
Arrays.setAll(data, i -> new DataClass());
Stream.generate(DataClass::new).limit(10).collect(Collectors.toList());