gpt4 book ai didi

java - 将自定义类对象添加到显示歧义的列表

转载 作者:行者123 更新时间:2023-12-02 12:15:42 26 4
gpt4 key购买 nike

这是我编写的示例测试代码,以确保我所知道的是正确的

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
}

这是我的 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。我不知道为什么会这样,有人可以帮忙吗?

最佳答案

setProductsToInvoice 中的以下代码 else 案例将 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);

我建议进行一项调查,以确定为什么有两个列表显然是并行维护的。乍一看,有点味道……

关于java - 将自定义类对象添加到显示歧义的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46193475/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com