2017-09-13 6 views
0

を示す一覧表示するカスタムクラスのオブジェクトを追加すると、来て出力がこれは私が私が知っていることを確実にするために書いたサンプルテストコードで曖昧

1 
1 

であり、それが正しいか、samples

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

権利でありますsampleListは、2つの異なるメモリ位置を指す2つの異なる参照であるため、samplesに追加すると、sampleListのサイズは変更されません。

しかし、私のプロジェクトコード、それは違うで

が、これはこれは

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両方の大きさをしている私のActionクラスのコードである私のFormクラス

public class InvoiceForm extends BaseActionForm { 
    private List<ProductTO> products; 
    private List<ProductTO> productList; 
    // getters and setters 
} 

です最初は1であるので、上記のコードでif blockが実行されます。コメント部分は前のコードです。新しいコードProductTO productTO = new ProductTO();または古いコードProductTO productTO = ProductEntryHandler.getInstance().prepareProductsForInvoice();であっても、問題は同じです。

私は、両方のリストのサイズがであるメソッドが実行されると言ったように。行invoiceForm.getProducts().add(productTO);が実行されると、productsproductListのサイズは2になります。これはテストコードと競合しています。ネストラインinvoiceForm.getProductList().add(productTO);が実行されると、リストサイズは両方とも3になります。私はなぜそれが起こっているのか分からない、誰かが助けることができる?

+0

リストオブジェクトを取得し、その中に要素を追加しています。それは間違いなくサイズを増やすでしょう。 – Kick

+0

@Kick私はテストコードを編集しましたが、テストの出力は同じです –

答えて

1

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

私は最初に2つのリストが並行して維持されている理由を調べる調査を提案したいと思います。一見すると、それには少し臭いがあります...

+0

あなたは正しいと思いますが、両方の参照に同じリストを供給していましたが、問題を引き起こしていました –

関連する問題