繁体   English   中英

Java-从构造函数填充数组

[英]Java - Populating an array from a constructor

我已经有一段时间没有接触Java了,对此我有些困惑。

我有一个“ Foo”类,其中有一个私有数组,其大小为5。

在类构造函数中,我需要传递这5个整数,所以我有这样的内容

public class Foo{

int [] numbers = new int[5];

Foo (int n0, int n1, int n2, int n3, int n4) {
    numbers[0] = n0;
    numbers[1] = n1;
    numbers[2] = n2;
    numbers[3] = n3;
    numbers[4] = n4;
}

这似乎是太多的工作,并且有一种更简单的方法可以完成,我只是不了解它。 诸如for循环之类的东西仅限于数组长度,例如

Foo(int n0, int n1, int n2, int n3, int n4, int s0, int s1) {
    for ( int i = o; i<= numbers.length; i++ ) {
         numbers[i]= "n + i";   // This is wrong, but just to get the idea.
    }
}

答案在某种程度上取决于您的解决方案的上下文。

如果这5个整数来自同一域,并且打算成为一个组的一部分,那么我建议您传递一个代表该组的参数,而不是传递5个单独的项。 Java提供了很好的机制来动态创建各种集合。

一些潜在的“群体”可能是:

public Foo(IntStream values) { ... }
new Foo(Stream.of(1, 3, 5, 7, 9));

public Foo(int[] values) {  ... }
new Foo(new int[]{1, 3, 5, 7, 9});

public Foo(int... values) { ... }
new Foo(1, 3, 5, 7, 9);

public Foo(List<Integer> values) { ... }
new Foo(Arrays.asList(1, 3, 5, 7, 9));

所有这些都提供了检查大小的方法,或者将其截断并转换为所需的任何内部格式。 如果您希望发送的值数量有所变化,这将需要最小的更改。 对特定值进行硬编码将意味着在值的数量更改时,构造函数的签名也会更改。

另一方面,如果参数不在同一个域中,但实际上代表可区分的属性,则将它们作为单独的参数提供给构造函数是有意义的。 但是,在这种情况下,将它们内部存储为一个集合没有太大意义,因此您可能需要使用标准的this.bar = bar图案将值存储在单独的变量中。

我认为构造函数不应视为在数据结构内插入(添加)对象的函数。 如果要这样做,我会写这样的东西:

Foo(int size) {
   this.numbers = new int[size];
}

void insert(int n, int location) {
   numbers[location] = n;
}

然后,您可以使用循环从客户端程序(主程序)中插入并使用变量i (用于循环计数器)分配location 那是我的建议。

注意:您可能需要以某种方式在代码中处理array out of bounds错误的可能性。

尝试这个。

Foo(int... n) {
    if (n.length != 5)
        throw new IllegalArgumentException("specify 5 ints");
    for (int i = 0; i < 5; ++i)
        numbers[i] = n[i];
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM