JAVA ArrayList从ArrayList方法中检索所有对象

时间:2015-08-21 20:32:38

标签: java methods arraylist

我有一个实现另一个超类的接口测试类。在测试类中,我有一个方法应该检索ArrayList中的所有对象。首先,它检查它是否为空。如果没有,它应该返回整个列表。这就是我的尝试。

public class ProductDBImpl implements ProductDB {

// field declarations
ArrayList<Product> products = new ArrayList<Product>();
@Override
public List<Product> getAllProducts() 
{
    // TODO Auto-generated method stub
    // TODO Auto-generated method stub
    // create an iterator for the Arraylist

    if (products.isEmpty())
    {
        return new ArrayList<Product>() ;
    }
    return products;
}

不幸的是,当我运行我的测试脚本(测试接口测试类和超类)时,getAllProducts()方法不能正常工作,它返回productdb.util.AssertionFailedError: expected:<1> but was:<0>消息。以下是测试脚本测试getAllProducts()方法的方法:

    // testing getAllProducts()
    List<Product> productList = productDB.getAllProducts();     
    int size = productList.size();      
    productList.remove(0);      
    productList = productDB.getAllProducts();       
    Assert.assertEquals(size, productList.size());

请帮我识别我的错误。谢谢。

1 个答案:

答案 0 :(得分:2)

返回对ArrayList对象的引用。然后修改对象。然后你得到另一个引用并发现该对象已被修改。

如果要保护数据结构不受外部修改,请返回新的List或UnmodifiableList:

@Override
public List<Product> getAllProducts() 
{
    return new ArrayList<>(products);
}

或者,为了避免额外的内存分配和副本(请注意,这将导致对测试代码中的.remove()调用失败;重要的是你是否必须允许调用者修改他们收到的列表) :

@Override
public List<Product> getAllProducts() 
{
    return Collections.unmodifiableList(products);
}