如何将List中的所有对象设置为null?

时间:2016-01-14 01:31:14

标签: java list null

我正在尝试做一些清理方法。我有几个字段,我想调用它们各自的清理方法,然后将它们设置为null。

就像这样:

if(obj != null)
{
    obj.cleanUp();
    obj = null;
}

但是我没有重复上述几次,而是考虑使用一种可以检查它们的方法:

public void checkAndClean(ArrayList<Object> objs)
{
    for(Object obj : objs)
    {
        if(obj != null)
        {
            obj.clean();
            obj = null;
        }
    }
}

我将所有对象添加到ArrayList,然后将其传递给该方法:

    ArrayList toClean = new ArrayList<Object>();
    toClean.add(obj1);
    toClean.add(obj2);
    checkAndClean(toClean);

但是这不起作用,我的单元测试显示调用此方法后对象不为null。

如何将List中的所有对象设置为null?

测试代码:

@Test
public void test()
{
    String string = "stuff";
    ArrayList toClean = new ArrayList<Object>();
    toClean.add(string);
    checkAndDestroy(toClean);
    assertEquals(null, string);
}

3 个答案:

答案 0 :(得分:1)

obj是一个引用,将其设置为null并不会更改ArrayList中的任何内容。

即使您要更改列表项,obj1和obj2也是对2个对象的引用。在ArrayList内部,您将项目的引用设置为null,但这不会更改obj1,obj2引用

答案 1 :(得分:1)

如果您想获取null引荐列表,可以使用List.set方法:

public void checkAndClean(ArrayList<Object> objs)
{
    for(int i=0; i<objs.size(); i++)
    {
        Object obj = objs.get(i);
        if(obj != null)
        {
            obj.clean();
            objs.set(i, null);
        }
    }
}

但是,您可能只需要从列表中删除所有元素。在这种情况下,您可以致电objs.clear()

public void checkAndClean(ArrayList<Object> objs)
{
    for(Object obj : objs)
    {
        if(obj != null)
        {
            obj.clean();
        }
    }
    objs.clear();
}

答案 2 :(得分:0)

如果我理解你的问题是正确的,那么你只有很多对象(不在列表中),并希望清理每个对象。

然后你就可以这样做而没有临时名单。

obj1 = checkAndClean(obj1);
obj2 = checkAndClean(obj2);

public Object checkAndClean(Object obj) {
    if(obj != null) {
        obj.clean();
    }
    return null;
}

该方法返回null以简化使用它的代码。它当然可以是void但是你需要调用它然后仍然obj1 = null;

使用新信息进行更新

如果所有对象都有不同的类,则可以使用泛型。

我将向您展示Number抽象类的示例,其中包含许多实现,如IntegerDobule

Integer obj1 = 1;
Double obj2 = 2.0;

obj1 = checkAndClean(obj1);
obj2 = checkAndClean(obj2);
System.out.println("" + obj1 + ", " + obj2);

public <T extends Number> T checkAndClean(T obj) {
    if(obj != null) {
        obj.intValue(); // your cleanup method
    }
    return null;
}