将自定义类对象添加到列表中以显示歧义

时间:2017-09-13 09:14:47

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

1 个答案:

答案 0 :(得分:1)

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

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