这是我编写的示例测试代码,以确保我所知道的是正确的
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);
}
}
产品和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
。我不知道为什么会这样,有人可以帮忙吗?
答案 0 :(得分:1)
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);
我建议进行一项调查,以确定为什么有两个列表显然是首先并行维护。乍一看,它有一点气味......