Java - 从构造函数填充数组

时间:2016-03-24 01:00:38

标签: java arrays 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.
    }
}

3 个答案:

答案 0 :(得分:3)

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

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

一些潜在的&#39;群组&#39;可能是:

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模式将值存储在单独的变量中。

答案 1 :(得分:2)

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

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

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

然后,您可以使用循环从客户端程序(main)插入,并为location分配变量i(for循环计数器)。多数民众赞成我的建议。

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

答案 2 :(得分:-1)

试试这个。

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