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为空!

我明白为什么会这样,但我想不出我是如何初始化循环中的对象的。

我不想这样做:

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

2 回答 2

3

xTable而那一系列静态变量是不同的引用可能指向同一个对象,但不能用于相互修改。也就是说,它们都可以用来修改同一个对象,但是在一个对象上拥有一个点并不会在该对象上产生另一个点。

我不太明白你的实际目标。我能提供的最好的方法是使用他们都会指出的一些中间类。所以mtOrders不会是 a MyType,而是 a MyTypeRef,它将有一个MyType字段。然后,将其初始化为 new MyTypeRef,并使用循环设置MyType所有 refs 中的对象。由于静态变量和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 回答