初始化最终的可变长度数组内联

时间:2015-07-24 20:56:49

标签: java arrays static initialization inline

假设我想初始化一个static final数组,该数组是某个对象的N个副本(为简单起见,我们说String)。我们必须内联初始化它,因为它是static final,我们不能使用数组文字,因为它是可变长度的(或不可行的长):

static final int N = 10000;
static final String foo = "baz";
//create a static array of 10000 copies of "baz"
static final String[] STRINGS = make_array_of(foo, N);

有没有办法在Java中内联(也就是说,某些函数是否执行make_array_of)?

2 个答案:

答案 0 :(得分:1)

您可以使用静态初始值设定项:

private static final String[] ARRAY;

static {
    // Initialize the array here
}

请注意,初始化程序必须在变量声明之后

根据您的具体情况,Arrays课程可以轻松实现:

static {
    STRINGS = new String[N];
    Arrays.fill(STRINGS, foo);
}

答案 1 :(得分:0)

在Java 8中,您可以尝试使用

Stream.generate(Supplier).limit(SIZE).toArray(Type[]::new);

(或者并行表现更好,但可读性稍差)

IntStream.range(0,SIZE).mapToObject(i->value).toArray(Type[]::new);

喜欢

private static final String[] ARRAY = Stream
        .generate(() -> foo) //you can also generate value dynamically here
        .limit(N)
        .toArray(String[]::new);