我想初始化一个包含索引值的多维私有静态最终数组。
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]和[TYPE_NORMAL]而不是[0]和[1]。在实际方面它是相同的,但第二个使得源更清晰,无差错和可维护。
例如,我是否应该在将来添加新的TYPE,我不需要关心数组中的数字索引。
正如我所说,我没有找到任何正确的语法来执行此操作,并且上述语法完全错误。 一些Java专家会给我一个简短的教训吗? :) 非常感谢你。
答案 0 :(得分: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 };
}
答案 1 :(得分: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()
获取所有枚举实例的数组。
推理:我认为如果您的数据行已经名称,那么他们实际上意味着一些东西,所以他们应该成为真实物体。如果你有一小组“常量”实例,那么枚举是一个不错的选择。这种设计为您提供了更大的灵活性(您可以制作数据阵列的防御副本,添加新属性,您可以添加,重新排列或删除枚举实例等,而不会破坏任何内容)。
答案 2 :(得分: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];
}
}