我定义了一些最终的String数组并在另一个地方初始化它们,现在我想让它更容易遍历它们,所以也许我需要将它们放在最终的String [] []中,
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){};
...
BTW我想通过遍历来分配
答案 0 :(得分:2)
只要您知道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};
稍后您仍然可以初始化数组的内容,因为只有数组引用本身才是最终的。
答案 1 :(得分:0)
如果你想拥有静态和最终数组,我建议你只使用带有访问器的singleton patten。这样你就有一个实例(静态),那些数组不能在另一个实例上更改(最终)。
public class ArrayContainer {
private ArrayContainer instance = new ArrayContainer();
private static final int SIZE_A = 1;
private static final int SIZE_B = 2;
private static final int SIZE_C = 3;
private static final int SIZE_D = 4;
private static String[] a, b, c, d;
private static String[][] all;
private ArrayContainer() {
a = new String[SIZE_A];
b = new String[SIZE_B];
c = new String[SIZE_C];
d = new String[SIZE_D];
all = new String[][]{a, b, c, d};
}
public String[] getA(){
return a;
}
public String[] getB(){
return b;
}
public String[] getC(){
return c;
}
public String[] getD(){
return d;
}
public String[][] getAll(){
return all;
}
}
无论如何你应该记住最终数组不是不可变的。如果您想要不可变,我建议您阅读:Immutable array in Java。
你仍然可以只添加像
这样的吸气剂public String get(int array, int index){
return all[i][y];
}
答案 2 :(得分:0)
如果需要初始化静态字段,请使用静态块:
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};
还要记住,上面例子中的顺序很重要。在初始化all
之前声明a
数组会导致The blank final field a may not have been initialized
错误。