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

JAVA ArrayList从ArrayList方法检索所有对象,java,methods,arraylist,Java,Methods,Arraylist,我有一个接口测试类,它实现了另一个超类。在测试类中,我有一个方法,该方法应该检索ArrayList中的所有对象。首先,它检查它是否为空。如果没有,它应该返回整个列表。以下是我的尝试 public class ProductDBImpl implements ProductDB { // field declarations ArrayList<Product> products = new ArrayList<Product>(); @Override public L

我有一个接口测试类,它实现了另一个超类。在测试类中,我有一个方法,该方法应该检索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;
}
公共类ProductDBImpl实现ProductDB{
//字段声明
ArrayList产品=新的ArrayList();
@凌驾
公共列表getAllProducts()
{
//TODO自动生成的方法存根
//TODO自动生成的方法存根
//为Arraylist创建迭代器
if(products.isEmpty())
{
返回新的ArrayList();
}
退货产品;
}
不幸的是,当我运行测试脚本(测试接口测试类和超类)时,getAllProducts()方法没有按它应该的方式工作,它返回了
productdb.util.AssertionFailedError:expected:但是was:
消息。下面是测试脚本测试getAllProducts()方法的方式:

//测试getAllProducts()
List productList=productDB.getAllProducts();
int size=productList.size();
productList.remove(0);
productList=productDB.getAllProducts();
Assert.assertEquals(size,productList.size());

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

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

如果要保护数据结构不受外部修改,请返回新列表或不可修改列表:

@Override
public List<Product> getAllProducts() 
{
    return new ArrayList<>(products);
}
@覆盖
公共列表getAllProducts()
{
返回新的ArrayList(产品);
}
或者,为了避免额外的内存分配和拷贝(请注意,这将导致对测试代码中.remove()的调用失败;重要的部分是您是否必须允许调用者修改他们接收到的列表):

@覆盖
公共列表getAllProducts()
{
退货收款。不可修改列表(产品);
}

上面是getAllProducts()或blue rpint的实际实现吗?是的,上面是getAllProducts()的实际实现。重写的方法只做了这么多,检查getAllProducts()中的empty.PS.)您有一条注释说“创建迭代器”,除了方法签名要求返回列表,而不是迭代器。您删除列表中的单个元素,然后希望保持其大小?什么?您知道引用是什么以及它们是如何工作的?…我是否应该按原样实现上述代码,即删除if块?@DeeTee让我问您:wh有if块和没有if块,at会有所不同?:)我猜无论哪种方式,它都会按原样返回ArrayList产品;无论是否包含对象……正确:当提供的集合为空时,都不会失败。因此,无论哪种方式,您都会创建一个空的新ArrayList,或者对原始集合的每个元素都有引用。
@Override
public List<Product> getAllProducts() 
{
    return new ArrayList<>(products);
}
@Override
public List<Product> getAllProducts() 
{
    return Collections.unmodifiableList(products);
}