将自定义 class 对象添加到显示歧义的列表
Adding custom class objects to list showing ambiguity
这是我编写的示例测试代码,以确保我所知道的是正确的
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
不会改变 [=16] 的大小=].
但是在我的项目代码中是不一样的,这是我的Form
class
public class InvoiceForm extends BaseActionForm {
private List<ProductTO> products;
private List<ProductTO> productList;
// getters and setters
}
这是我的代码 Action
class
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);
}
}
products 和 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
。我不知道为什么会这样,有人可以帮忙吗?
setProductsToInvoice
中的以下代码 else
将 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);
我建议进行调查以确定为什么首先要同时维护两个列表。乍一看有点腥味...
这是我编写的示例测试代码,以确保我所知道的是正确的
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
不会改变 [=16] 的大小=].
但是在我的项目代码中是不一样的,这是我的Form
class
public class InvoiceForm extends BaseActionForm {
private List<ProductTO> products;
private List<ProductTO> productList;
// getters and setters
}
这是我的代码 Action
class
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);
}
}
products 和 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
。我不知道为什么会这样,有人可以帮忙吗?
setProductsToInvoice
中的以下代码 else
将 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);
我建议进行调查以确定为什么首先要同时维护两个列表。乍一看有点腥味...