这是我编写的示例测试代码,以确保我所知道的正确
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
没错,
samples
和sampleList
是指向两个不同内存位置的两个不同引用,因此添加到samples
不会改变sampleList
的大小。但是在我的项目代码中有所不同,这是我的
Form
类public class InvoiceForm extends BaseActionForm {
private List<ProductTO> products;
private List<ProductTO> productList;
// getters and setters
}
这是我的
Action
类中的代码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);
}
}
product和productList最初的大小均为
1
,因此在上述代码中,将执行if block
。注释部分是较早的代码。即使是新代码ProductTO productTO = new ProductTO();
或旧代码ProductTO productTO = ProductEntryHandler.getInstance().prepareProductsForInvoice();
,问题也相同。就像我说的那样,当执行该方法时,两个列表的大小都为
1
。当执行invoiceForm.getProducts().add(productTO);
行时,products
的大小和productList
大小变为2
,这与我的测试代码冲突。现在,当执行嵌套行invoiceForm.getProductList().add(productTO);
时,两个列表的大小都将变为3
。我不知道为什么会发生这种情况,有人可以帮忙吗? 最佳答案
else
中的以下代码setProductsToInvoice
大小写将products
和productList
设置为同一列表:
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);
我建议进行调查以确定为什么首先显然要同时维护两个列表。乍一看,它闻起来有点香...