8

基本的には、コンパイル時に既知の値のデータ構造を作成したいと思います。Cでは次のようにします。

struct linetype { int id; char *descr; };

static struct linetype mylist[] = {
    { 1, "first" },
    { 2, "second" }
};

私がJavaで見つけた唯一の魂は、実行時に配列を作成することです。

public class Outer {

    public class LineType {
        int id;
        String descr;

        private LineType( int a, String b) {
          this.id = a;
          this.descr = b;
        }
    }

    LineType[] myList = { 
        new LineType( 1, "first" ),
        new LineType( 2, "second" ),
    };

これは面倒で効果がないように見えます(構造が長く複雑になる場合)。別の方法はありますか?

(注:これはこの質問用に作成されたサンプルコードにすぎないため、構文エラーは無視してください。また、文字列はデータセグメントを指す文字ポインタ以外の何かであることに気づいています。ただし、引数はプリミティブデータタイプでも機能します。 )。

4

6 に答える 6

9

LineTypeを静的クラスにする必要があります。

public class Outer {

    public static class LineType {
        int id;
        String descr;

        private LineType( int a, String b) {
          this.id = a;
          this.descr = b;
        }
    }

    static LineType[] myList = { 
        new LineType( 1, "first" ),
        new LineType( 2, "second" ),
    };
}
于 2012-11-12T19:01:54.413 に答える
1

Javaでは、コンパイル時に配列を作成することはできません(配列は特殊なタイプのオブジェクトです)。静的ブロックを使用したクラスのロード時間(または)ランタイム(インスタンス変数として)のいずれかで、配列を作成できます。

静的ブロックの例:

class TestClass
{
     static {
     arr[0] = "Hi";     
     arr[1] = "Hello";     
     arr[2] = "How are you?"; 
    }
....
}
于 2012-11-12T18:57:26.143 に答える
1

新しいオブジェクトの使用を避けたい場合Mapは、配列の代わりに使用できます。ただし、最初の値(1、2など)は常に一意である必要があることに注意してください。Mapについては、Oracleのドキュメントを参照してください。

private static Map<Integer, String> myMap = new TreeMap<Integer, String>();

static {
    myMap.put(1, "first");
    myMap.put(2, "second");
}
于 2012-11-12T19:00:07.390 に答える
1

私が得ていないものがない限り、これは次のように単純なはずです:

Object[][] mylist = {{1, "first"}, {2, "second"}};
于 2012-11-12T19:02:40.747 に答える
0

データ構造が本当に乱雑で複雑で、コードを「乱雑」にしたくない場合は、まったく別の小さなプログラムでデータを作成し、シリアル化してディスクに保存することができます。あなたの「本当の」プログラムはそれを逆シリアル化/読み取るだけです。

もちろん、これは実際に何が起こっているのかを曖昧にするので、本当に必要でない限り、このテクニックは避けたいと思います。

アプリの初期読み込み速度が遅いというだけの問題がある場合は、ホルダーパターンを使用して静的初期化子を延期できます

于 2012-11-12T19:07:48.680 に答える
-1

Javaの静的ブロックを使用してそれらを初期化できます。

class Outer
{
  static 
  {
    // whatever code is needed for initialization goes here
  }
}
于 2012-11-12T18:57:14.160 に答える