如何在数组中初始化null对象?

时间:2012-07-01 08:39:15

标签: java arrays object null initialization

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();

2 个答案:

答案 0 :(得分:3)

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

我不太明白你的实际目标。我能提供的最好的就是使用他们都会指出的一些中级课程。因此,mtOrders不是MyType,而是MyTypeRef,它将包含MyType字段。然后,将其初始化为新的MyTypeRef,并使用循环在所有引用中设置MyType个对象。由于静态变量和xTable条目都指向同一个MyTypeRef,因此将MyType字段设置为一个也会影响另一个。

IMO,使用该循环而不是初始化每个单独的变量看起来像更严格的代码,但它不起作用。只需写几行代码,所以它不是很漂亮但实际上有效。

答案 1 :(得分: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);

如果这不符合您的需求,您只需要分别指定每个字段。