Java 将自定义类对象添加到显示歧义的列表
这是我编写的示例测试代码,以确保我所知道的是正确的Java 将自定义类对象添加到显示歧义的列表,java,forms,list,action,struts-1,Java,Forms,List,Action,Struts 1,这是我编写的示例测试代码,以确保我所知道的是正确的 class Form { List<Sample> samples; List<Sample> sampleList; public List<Sample> getSamples() { return samples; } public void setSamples(List<Sample> samples) { this
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());
}
}
这是正确的,samples和sampleList是指向两个不同内存位置的两个不同引用,因此添加到samples不会改变sampleList的大小
但在我的项目代码中是不同的,这是我的表单类
products和productList最初的大小都是1,因此在上面的代码中,将执行if块。注释部分是前面的代码。即使是新代码ProductTO ProductTO=new ProductTO;或者旧代码ProductTO ProductTO=ProductEntryHandler.getInstance.PrepareProductsForVoice;问题是一样的
就像我说的,当方法执行时,两个列表的大小都是1。当行invoiceForm.getProducts.addproductTO时;执行时,产品的大小和productList大小变为2,这与我的测试代码冲突。现在,当嵌套行invoiceForm.getProductList.addproductTO;执行时,列表大小将变为3。我不知道为什么会发生这种情况,有人能帮忙吗?下面的代码在setProductsToInvoice中将products和productList设置为同一个列表:
正确的方法,或者至少是不那么错误的方法,是这样的:
ProductTO newProd =
ProductEntryHandler.getInstance().prepareProductsForInvoice());
invoiceForm.setProducts(new ArrayList<ProductTO>());
invoiceForm.getProducts().add(newProd);
invoiceForm.setProductList(new ArrayList<ProductTO>());
invoiceForm.getProductList().add(newProd);
我建议进行一次调查,以确定为什么有两份名单显然是同时存在的。乍一看,它有点异味…您正在检索列表对象并在其中添加元素。它将明确地增加大小。@Kick我已经编辑了测试代码,但测试的输出是相同的。您是对的,我将相同的列表提供给了两个引用,这是导致问题的原因
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);
}
}
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);