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);