Java 我可以用其他最终字符串[]定义最终字符串[]吗?

Java 我可以用其他最终字符串[]定义最终字符串[]吗?,java,Java,我定义了一些最终字符串数组,并在另一个地方初始化它们,现在我想让遍历它们更容易,所以可能需要将它们放入最终字符串[] private static final String[] a,b,c,d; private static final String[][] all = {a,b,c,d}; 但它给了我错误 The blank final field a may not have been initialized 现在我知道最后一个变量应该在使用前赋值,但我不知道如何解决我的问题,有

我定义了一些最终字符串数组,并在另一个地方初始化它们,现在我想让遍历它们更容易,所以可能需要将它们放入最终字符串[]

  private static final String[] a,b,c,d;
  private static final String[][] all = {a,b,c,d};
但它给了我错误

The blank final field a may not have been initialized
现在我知道最后一个变量应该在使用前赋值,但我不知道如何解决我的问题,有没有比下面的代码更容易遍历a、b、c、d的方法

  for(String s : a){};
  for(String s : b){};
  ...

顺便说一句,我想通过遍历它们来分配,只要您知道
a
d
的大小,就可以在声明它们时初始化它们:

private static final String[] a = new String[YOUR_VALUE_HERE], 
                              b = new String[YOUR_VALUE_HERE],
                              c = new String[YOUR_VALUE_HERE],
                              d = new String[YOUR_VALUE_HERE];
private static final String[][] all = {a,b,c,d};

以后您仍然可以初始化数组的内容,因为只有数组引用本身是最终的。

如果您想要静态数组和最终数组,我建议您使用仅带访问器的单例模式。这样,您就有一个实例(静态),而这些数组不能在另一个实例(最终)上更改

无论如何,您应该记住,最终数组不是不可变的。如果您想拥有不可变的,我建议您阅读以下内容:

仍然可以只添加getter,如

public String get(int array, int index){
    return all[i][y];
}

如果需要初始化静态字段,请使用静态块:

static final String[] a;
static {
    // put all the logic here
    // and assign final var at the end
    a = new String[17];
}
static final String[][] all = {a};

还要记住,上面例子中的顺序很重要。在初始化
a
之前声明
all
数组将导致
空白的最终字段a可能尚未初始化
错误。

当前在哪里初始化
字符串[]
变量?我在构造函数中初始化它们或者你在构造函数中初始化
静态
变量?@Oli Charlesworth orz…这似乎是错误的。现在我在静态块中初始化它们,仍然存在错误,所以你可以使用
静态
初始化器块:静态
{/*init arrays here*/}/code>
static final String[] a;
static {
    // put all the logic here
    // and assign final var at the end
    a = new String[17];
}
static final String[][] all = {a};