我可以用其他一些最终的String []来定义一个最终的String [] []吗?

时间:2014-05-11 13:35:09

标签: java

我定义了一些最终的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我想通过遍历来分配

3 个答案:

答案 0 :(得分:2)

只要您知道ad的大小,就可以在声明时初始化它们:

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错误。