将自定义 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

而且是正确的,samplessampleList 是指向两个不同内存位置的两个不同引用,因此添加到 samples 不会改变 [=16] 的大小=].

但是在我的项目代码中是不一样的,这是我的Formclass

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);行时,productsproductList的大小变成了2,这与我的测试代码有冲突。现在,当执行嵌套行 invoiceForm.getProductList().add(productTO); 时,两个列表的大小都变为 3。我不知道为什么会这样,有人可以帮忙吗?

setProductsToInvoice 中的以下代码 elseproductsproductList 都设置为 相同的列表 :

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

我建议进行调查以确定为什么首先要同时维护两个列表。乍一看有点腥味...