1

我想初始化一个多维私有静态最终整数数组,索引值。

private static final int[][] a = { {0,0,0}, {1,2,3} };

这对我不好。我在某个地方发现了我尝试过的这种奇怪的语法,但无论如何都不想编译。我添加它以澄清我需要什么:

private static final int[][] a;
private static {
    a = new int[NUM_TYPES][3];
    a [TYPE_EMPTY]  =   { 0, 0, 0 };
    a [TYPE_NORMAL] =   { 1, 2, 3 };
    };

不同的是现在我应该有一个[TYPE_EMPTY] 和a[TYPE_NORMAL] 而不是a[0] 和a[1]。在实际方面它是相同的,但第二个使源代码更加清晰、无错误和可维护。

例如,如果我将来添加一个新的 TYPE,我不需要关心数组中的数字索引。

正如我所说,我没有找到任何正确的语法来做到这一点,上面的语法是完全错误的。一些Java专家会给我一个简短的教训吗?:) 非常感谢你。

4

3 回答 3

7

试试这个 -

private static final int[][] a;
private static final int NUM_TYPES  = 2;
private static final int TYPE_EMPTY = 0;
private static final int TYPE_NORMAL = 1;

static { // static initializer  block.
    a = new int[NUM_TYPES][3];
    a [TYPE_EMPTY] =  new int[]{ 0, 0, 0 };
    a [TYPE_NORMAL] = new int[]{ 1, 2, 3 };
}

静态初始化块参考

于 2013-02-13T09:27:54.630 回答
2

我建议使用枚举来保存您的数据:

public enum TYPE {
  TYPE_EMPTY(0,0,0),
  TYPE_NORMAL(1,2,3);

  private int[] data; 

  TYPE(int... data) {
     this.data = data;
  }

  public int[] getData() {
     return data;
  }
}

您可以使用TYPE.values().

推理:我认为如果你已经为你的数据行命名,它们实际上对有意义,所以它们应该是真实的对象。如果您有一小组“常量”实例,那么枚举是一个不错的选择。这种设计为您提供了更大的灵活性(您可以制作数据数组的防御性副本,添加新属性,您可以添加、重新排列或删除枚举实例等而不会破坏任何内容)。

于 2013-02-13T09:40:42.553 回答
1

每当我看到private static final int ...定义硬偏移等时,我都会尝试想一种方法enums来解决问题,因为——毕竟——它们就是这样。

我想出了这个:

enum MyType {
  Empty(null),
  Normal(new int[] {1,2,3});
  // My values.
  final int [] values;
  // Constructor.
  MyType(int [] values) {
    this.values = values;
  }

  // Getter - equivalent to the array access.
  public int get(int i) {
    return values == null ? 0 : values[i];
  }
}
于 2013-02-13T09:51:41.250 回答