输入ArrayList的每个实例化对象是否使用与该ArrayList相同的引用?

时间:2016-10-11 14:00:11

标签: java arraylist reference

我有一个平面文件阅读器类,它从dat文件中读取,创建存储在其独特的arraylist中的person,customer和product对象,我必须将它用于getInvoice方法。从发票数据文件输入新属性时,我只为我从发票数据文件中读取的产品创建新的产品列表。这似乎工作正常,但是每个发票对象上的某些产品属性正在更改。

当使用产品arraylist作为字段实例化新发票对象时,是否会创建对下面代码中添加的产品列表的引用或该列表的副本一旦生成?如果它只是一个参考,为什么当我读取每个发票对象中的产品列表时,每个发票(而不是所有产品)的产品对象数量是否正确?此外,如果我在创建发票对象(其产品列表为字段)后清除新产品arraylist,那么我的所有发票中的产品列表都是空的。为什么是这样?如果一个arraylist不起作用,我怎么能这样做?谢谢,如果需要,我可以添加更多代码。

ng-repeat

1 个答案:

答案 0 :(得分:0)

不完全确定你在问什么,但让我们看看;我想你的观点是:

您的班级有一些字段 invoiceList );并且您的方法只需新的Invoice对象附加到该列表中。

假设 invoiceList 对象未被清除,或其他一些代码调用

invoiceList = new ArrayList<>()

重复,然后你的代码总是使用相同的 ArrayList对象。

乍一看,您的整体设计可以改进。您看,新对象添加到同一列表意味着您依赖于副作用。但另一方面,您的方法也返回您所使用的列表。你应该做一个另一个;但不是两个。

因此,选项一 - 依赖于使用字段,如:

class InvoiceCollector {
   private final List<Invoice> invoices = new ArrayList<>();

   public void addNewInvoices() {
     ... reads data from file and adds new objects to invoices

   public List<Invoice> getCurrentInvoices() {
     return new ArrayList<>(invoices);

(返回该列表的副本可防止接收该列表引用的代码**在外部对其进行操作)

选项二:仅返回收集的最后一个发票(并避免在该类上完全使用字段):

public List<Invoice> collectInvoices() {
  List<Invoice> invoices = ...
  ... all the code you have in your method
  return invoices;
}

最后:

  • 阅读单层抽象原理。你糟糕的方法是在一个地方做太多。用更好的小方法更好地划分
  • 通常,称为&#34; getSomething()&#34;不会那么多&#34;计算&#34;。所以,您可能还应该查看命名的内容,以避免让您的代码感到惊讶!

编辑 - 解决您的评论(以及问题中的&#34;真实&#34;意图):循环体中的第一件事是创建名为 product 的新列表。那东西以某种方式填充;最后;该列表对象被赋予新的Invoice对象。因此:创建的所有新发票对象应使用不同的列表

并且为了记录:您的主要问题是您编写了如此难以阅读代码。它以您的变量名称开头:product(作为LIST!),产品(作为数组),productList(落在天空中)等等。所以,我的个人建议:进入并返工您的代码,使其可读。因为那时会理解正在做什么。

创建混乱代码;然后需要其他人向你解释你的代码正在做什么。