【问题标题】:Initializing a final variable-length array inline [duplicate]初始化最终的可变长度数组内联[重复]
【发布时间】:2015-07-24 20:56:48
【问题描述】:

假设我想初始化一个 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)?

【问题讨论】:

  • this 重复回答。
  • 真是绝配!不知道为什么这个答案被埋没了......

标签: java arrays static initialization inline


【解决方案1】:

你可以使用静态初始化器:

private static final String[] ARRAY;

static {
    // Initialize the array here
}

注意初始化器必须在变量声明之后


针对您的特殊情况,Arrays 类可以让事情变得简单:

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

【讨论】:

    【解决方案2】:

    在 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);
    

    【讨论】:

      猜你喜欢
      • 2013-06-24
      • 2014-07-25
      • 1970-01-01
      • 2021-12-30
      • 2013-09-22
      • 2016-02-20
      • 2011-06-02
      • 1970-01-01
      • 2020-04-12
      相关资源
      最近更新 更多