我正在尝试做一些清理方法。我有几个字段,我想调用它们各自的清理方法,然后将它们设置为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);
}
答案 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
抽象类的示例,其中包含许多实现,如Integer
或Dobule
。
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;
}