【问题标题】:How to init null-objects in array?如何在数组中初始化空对象?
【发布时间】:2012-07-01 08:39:14
【问题描述】:
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();

【问题讨论】:

    标签: java arrays object null initialization


    【解决方案1】:

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

    我不太了解您的实际目标。我能提供的最好的方法是使用他们都会指出的一些中间类。所以mtOrders 将不是MyType,而是MyTypeRef,它将有一个MyType 字段。然后,将其初始化为新的MyTypeRef,并使用循环在所有参考中设置MyType 对象。由于静态变量和xTable 条目都将指向同一个MyTypeRef,因此将MyType 字段设置为一个也会影响另一个。

    IMO,使用该循环而不是初始化每个单独的变量看起来像更紧凑的代码,但它不起作用。再多写几行代码,虽然不好看,但确实有效。

    【讨论】:

    • 好吧,我并不喜欢这个解决方案,因为它为每个变量添加了一个额外的包装器,只是为了绕过一些初始化问题。但这是你的代码......
    • 我的初始化确实比我展示的要复杂得多。我想,向数组添加新变量比复制粘贴很多代码行更简单。
    【解决方案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);
    

    如果这不能满足您的需求,您只需单独分配每个字段。

    【讨论】:

    • 感谢您的回答。我会按照 Eran 的建议去做。
    猜你喜欢
    • 2020-04-21
    • 2016-03-11
    • 2018-02-26
    • 1970-01-01
    • 2022-08-12
    • 2012-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多