1

値にインデックスを付けて、int の多次元プライベート static final 配列を初期化したいと考えています。

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 };
    };

違いは、[0] と [1] の代わりに [TYPE_EMPTY] と [TYPE_NORMAL] を持つ必要があることです。実用的な面では同じですが、2 番目のものを使用すると、ソースがより明確になり、エラーがなくなり、保守しやすくなります。

たとえば、将来新しい 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 に答える