2017-09-13 146 views
0

这是一个简单的测试代码,我写的,以确保我知道什么是正确的添加自定义的类对象列表中出现歧义

class Form { 
    List<Sample> samples; 
    List<Sample> sampleList; 
    public List<Sample> getSamples() { 
     return samples; 
    } 
    public void setSamples(List<Sample> samples) { 
     this.samples = samples; 
    } 
    public List<Sample> getSampleList() { 
     return sampleList; 
    } 
    public void setSampleList(List<Sample> sampleList) { 
     this.sampleList = sampleList; 
    } 
    void setInitialData() { 
     this.samples = new ArrayList<Sample>(); 
     this.sampleList = new ArrayList<Sample>(); 
    } 
} 

class Sample { 

} 

public class ListAddingAmbiguity { 

    public static void main(String[] args) { 
     Form form = new Form(); 
     form.setInitialData(); 
     Sample sample = new Sample(); 
     form.getSamples().add(sample); 
     form.getSampleList().add(sample); 
     System.out.println(form.getSamples().size()); 
     System.out.println(form.getSampleList().size()); 
    } 
} 

来输出是

1 
1 

而且它是正确的,samplessampleList是两个不同的参考指向两个不同的内存位置,因此添加到samples将不会更改大小sampleList

但在我的项目代码是不同的,这是我的Form

public class InvoiceForm extends BaseActionForm { 
    private List<ProductTO> products; 
    private List<ProductTO> productList; 
    // getters and setters 
} 

这是

private void setProductsToInvoice(InvoiceForm invoiceForm) throws Exception { 

     if(invoiceForm.getProducts() != null && !invoiceForm.getProducts().isEmpty()){ 
      ProductTO productTO = new ProductTO();//ProductEntryHandler.getInstance().prepareProductsForInvoice(); 
      invoiceForm.getProducts().add(productTO); 
      invoiceForm.getProductList().add(productTO); 
     }else { 
      List<ProductTO> productTOs = new ArrayList<ProductTO>(); 
      productTOs.add(ProductEntryHandler.getInstance().prepareProductsForInvoice()); 
      invoiceForm.setProducts(productTOs); 
      invoiceForm.setProductList(productTOs); 
     } 
    } 

无论是产品和productList的是具有尺寸的代码在我Action1最初,所以在上面的代码if block将执行。注释部分是较早的代码。即使是新代码ProductTO productTO = new ProductTO();或旧代码ProductTO productTO = ProductEntryHandler.getInstance().prepareProductsForInvoice();问题也是如此。

就像我在执行方法时所说的那样,这两个列表的大小都是1。当执行invoiceForm.getProducts().add(productTO);行时,大小为productsproductList的大小变为2,这与我的测试代码冲突。现在当嵌套行invoiceForm.getProductList().add(productTO);被执行时,列表大小变为3。我不知道为什么它会发生,有人可以帮忙吗?

+0

您正在检索列表对象,并添加其中的元素。它会定义增加大小。 – Kick

+0

@Kick我编辑了我的测试代码,但测试的输出是相同的 –

回答

1

下面的代码else情况setProductsToInvoice同时设置productsproductList相同的列表

List<ProductTO> productTOs = new ArrayList<ProductTO>(); 
productTOs.add(ProductEntryHandler.getInstance().prepareProductsForInvoice()); 
invoiceForm.setProducts(productTOs); 
invoiceForm.setProductList(productTOs); 

正确的方法,或者至少是少不正确的方法是这样的:

ProductTO newProd = 
    ProductEntryHandler.getInstance().prepareProductsForInvoice()); 
invoiceForm.setProducts(new ArrayList<ProductTO>()); 
invoiceForm.getProducts().add(newProd); 

invoiceForm.setProductList(new ArrayList<ProductTO>()); 
invoiceForm.getProductList().add(newProd); 

我建议进行一项调查,以确定为什么有两个列表显然是平行维护的第一个地方。乍一看,它有一点点的气味...

+0

您是对的我将相同的列表提供给两个引用,并且导致了问题 –