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

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


product和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。我不知道为什么会发生这种情况,有人可以帮忙吗?

最佳答案

else中的以下代码setProductsToInvoice大小写将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);


我建议进行调查以确定为什么首先显然要同时维护两个列表。乍一看,它闻起来有点香...

10-04 19:33