1
public static MyType mtOrders;    
public static MyType mtCustomers;    
public static MyType mtItems;    
public static MyType mtGroups;    
public static MyType mtDelieverAddresses;    
public static MyType mtVendors;    
public static MyType mtOrderItems;    
public static MyType mtPrims;        

public final static MyType[] xTable = {mtCustomers, mtGroups, mtItems, mtOrders,
                        mtDelieverAddresses, mtVendors, mtOrderItems, mtPrims};

for (int i = 0; i < xTables.length; i++) {    
  xTable[i] = new MyType();
}

実行後xTable、要素は初期化されますが、mtOrders...mtPrimsはnullです!

なぜそうなのかは理解できますが、ループ内のオブジェクトをどのように初期化するのかわかりません。

私はこれをしたくありません:

mtOrders = new MyType();
mtCustomers = new MyType();
...
mtPrims = new MyType();
4

2 に答える 2

3

xTableそして、その一連の静的変数は異なる参照であり、同じオブジェクトを指している可能性がありますが、相互に変更するために使用することはできません。つまり、両方を使用して同じオブジェクトを変更できますが、オブジェクトに1つのポイントがあると、そのオブジェクトにもう1つのポイントが作成されることはありません。

私はあなたの実際の目標をよく理解していません。私が提供できる最善の方法は、それらがすべて指す中間クラスを使用することです。したがって、はではmtOrdersなくMyType、フィールドMyTypeRefを持つことになりMyTypeます。次に、それを新しいMyTypeRefに初期化し、ループを使用しMyTypeてすべての参照にオブジェクトを設定します。静的変数とxTableエントリの両方が同じを指すため、一方にフィー​​ルドをMyTypeRef設定するMyTypeと、もう一方にも影響します。

IMOは、個々の変数を初期化する代わりにそのループを使用すると、より厳密なコードのように見えますが、機能しません。あと数行のコードを書くだけなので、それほどきれいではありませんが、実際に機能します。

于 2012-07-01T08:51:56.340 に答える
2

Javaには、参照変数に割り当てる以外に、参照変数を初期化する方法がありません。あなたはおそらく地図であなたが望むものに近づくことができます:

public static final String myOrders = "mtOrders";
// etc.

public final static Map<String, MyType> xTable;

static {
    HashMap<String, MyType> table = new HashMap<String, MyType>();
    String[] keys = { myOrders, . . . }
    for (int i = 0; i < keys.length; ++i) {
        table.put(keys[i], new MyType());
    }
    xTable = Collections.unmodifiableMap(table);
}

次に、次の方法で個々の要素を取得できます。

MyType orders = xTable.get(myOrders);

これがニーズを満たさない場合は、各フィールドを個別に割り当てる必要があります。

于 2012-07-01T08:51:11.300 に答える