4

Javaでデータ構造を定数値に初期化する方法はありますか?私は高低を検索しましたが、そのようなテクニックは見つかりませんでした。特に、Stringやintなどの混合データ型を含むクラスを初期化したいです。

class xyz {
      String a;
      int    b;
}

static final xyz example1 = { "string value", 42 };    // This doesn't work.

static final xyz[] example2 = { { "value a", 42 }, { "value b", 43 } };  // this also doesn't work

文字列の配列、さらには文字列の2次元配列を初期化できますが、何らかの理由でレコード構造またはレコード構造の配列を初期化できません。私はこれをDelphiで日常的に行っていますが、この機能なしで生活するのは非常に困難です。

さて、私は約40年間プログラミングをしているので、私はまったくの初心者ではありません。このようなことが可能かどうかを知る必要があります。ファイルから読み込まれるのではなく、アプリに定数データを埋め込み、代入ステートメントを使用してデータを設定することで、定数として宣言するという目的(最終)が無効になります。

提案やコメントをありがとう。Javaに変換するPascalコードがたくさんあり、すべてのデータ構造を再設計する必要がないため、この問題の適切な解決策を見つけたいと思います。

4

4 に答える 4

9

If you don't want to use a constructor or a static block as proposed in other answers, you can use the double brace initialization syntax:

static final xyz example1 =
  new xyz() {{ a = "string value"; b = 42; }}; 

Note that it creates an anonymous class.
Your second example would look like:

static final xyz[] example1 = new xyz[] {
  new xyz() {{ a = "value a"; b = 42; }},
  new xyz() {{ a = "value b"; b = 43; }}
};

However, if you have access to the xyz class, adding a constructor that takes two parameters would be more readable and (slightly) more efficient.

于 2012-09-25T17:41:24.397 に答える
3

1つの方法は、クラスのコンストラクターを記述xyzして、目的を達成することです。

class xyz {
      String a;
      int    b;

         xyz(String tempStr, int tempInt)
              {
            this.a = tempStr;
            this.b = tempInt;
             }
}

static final xyz example1 = new xyz("String value",  42);
于 2012-09-25T17:31:43.490 に答える
0

これには列挙型を使用できます

enum xyz {
    VALUE_A("value a", 42), VALUE_B("value b", 43);

    String a;
    int b;

    xyz(String str, int value) {
        a = str;
        b = value;
    }

    static EnumSet<xyz> bothValues = EnumSet.of(xyz.VALUE_A, xyz.VALUE_B);
}
于 2012-09-25T17:45:55.133 に答える
0

コンストラクターを作成するかxyz(String,int)、デフォルトのコンストラクターを使用してstaticブロック内の値を初期化できます。

static final xyz example1 = new xyz();
static { 
  example1.a = "string value";
  example1.b = 42;
}

注: 初期化クラスのフィールドにアクセスできる必要があります。

また、注意してください: ifxyzは内部クラスですstatic。上記のコードを機能させるには、おそらくそれを宣言する必要があります。


PS Java の規則では、クラス名の最初の文字として大文字を使用しているため、おそらく名前を変更する必要があります。Xyz

于 2012-09-25T17:33:11.930 に答える