【问题标题】:JAVA ArrayList retrieve all objects from ArrayList methodJAVA ArrayList 从 ArrayList 方法中检索所有对象
【发布时间】:2015-08-21 20:32:38
【问题描述】:

我有一个实现另一个超类的接口测试类。在测试类中,我有一个方法应该检索 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:&lt;1&gt; but was:&lt;0&gt; 消息。下面是测试脚本测试 getAllProducts() 方法的方式:

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

请帮我找出我的错误。谢谢。

【问题讨论】:

  • 上面的实际实现是getAllProducts()还是blue rpint?
  • 是的,上面是getAllProducts()的实际实现。
  • 被覆盖的方法只做了这么多,检查是否为空。
  • PS. 在 getAllProducts() 中有一条注释说“创建一个迭代器”,除了方法签名需要返回一个列表,而不是迭代器。
  • 您删除了列表中的单个元素,然后您希望保持其大小?什么?你知道什么是引用以及它们是如何工作的吗? ...

标签: java methods arraylist


【解决方案1】:

您返回对 ArrayList 对象的引用。然后修改对象。然后你得到另一个对它的引用,发现对象被修改了。

如果你想保护数据结构不被外部修改,那么返回一个新的List或者一个UnmodifiableList:

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

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

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

【讨论】:

  • 我应该按原样实现上述代码,即删除 if 块吗?
  • @DeeTee 让我问你:有和没有 if 块会有什么不同? :)
  • 我猜无论哪种方式它都会按原样返回 ArrayList 产品;里面有没有对象...
  • 正确:当提供的 Collection 为空时,ArrayList constructor 不会失败。因此,无论哪种方式,您都可以创建一个空的新 ArrayList,或者引用原始的每个元素。
猜你喜欢
  • 2017-08-17
  • 2012-10-09
  • 1970-01-01
  • 2014-06-29
  • 2013-11-15
  • 1970-01-01
  • 1970-01-01
  • 2016-10-30
  • 1970-01-01
相关资源
最近更新 更多