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();
答案 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);
如果这不符合您的需求,您只需要分别指定每个字段。