在ArrayList中存储对象的引用

时间:2014-01-25 19:26:43

标签: java arrays jsp arraylist

嘿大家我试图存储当前对arraylist“pl”的引用。的 e.g。 pl.add(本); 出于某种原因,我只得到对最后一项的引用而没有以前的项。 Loop确实经历了所有这三个项目。

以下是我得到的代码和输出。任何人都可以告诉我我做错了什么,谢谢你提前帮助。

       // variables
private String productType;
private String hyperLinkParam;
private ArrayList <ProductList> pl = new ArrayList<ProductList> ();

public ProductList() {

    try {

        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        DocumentBuilder db = dbf.newDocumentBuilder();

       InputStream url = null;
        url = getClass().getResourceAsStream("inventory.xml");


        Document doc = db.parse(url);
        doc.getDocumentElement().normalize();

        // loop through each item
        NodeList items = doc.getElementsByTagName("item"); //Returns a list of elements with the given tag name item
        for (int i = 0; i < items.getLength(); i++)
        {

                Element e = (Element) items.item(i);
                setHyperLinkParam(e.getAttribute("name").toString());
                setProductType(getTextValue(e,"productType"));
                System.out.print(e.getAttribute("name").toString());
                System.out.println(getTextValue(e,"productType"));

                pl.add(this);


         }

          for(int j=0; j < pl.size(); j++){
            System.out.print("getHyperLinkParam: " + pl.get(j).getHyperLinkParam());
            System.out.println("getProductType: " + pl.get(j).getProductType());
          }

Manufacture.java

    @WebMethod(operationName = "getProductList")
public ProductList getProductList() {
    try {
        ProductList productlist = new ProductList();
        if(productlist == null){
            return null;
        }else{
            return productlist;
        }
    } catch(Exception e){
        System.out.println("error: " + e.getMessage());
        return null;
    }
}

的index.jsp

    <%
try {
org.soen487.supplychain.manufacturer.Manufacture_Service service = new org.soen487.supplychain.manufacturer.Manufacture_Service();
org.soen487.supplychain.manufacturer.Manufacture port = service.getManufacturePort();
// TODO process result here
org.soen487.supplychain.manufacturer.ProductList result = port.getProductList();
out.println("Result = "+result);

} catch (Exception ex) {
// TODO handle custom exceptions here
}
%>

4 个答案:

答案 0 :(得分:3)

这是问题所在:

pl.add(this);

您一次又一次地添加相同的引用(this)。 this 的值只是对“当前”对象的引用 - 您正在循环中修改该对象的内容。

在循环的每次迭代中,您应该创建一个新的独立对象,在 对象上设置属性,然后将该对象的引用添加到列表中。

你要将this添加到列表中有点奇怪,说实话 - 通常这样的方法会在某个知道如何解析XML的类中,而不是一个实例。数据项本身。目前尚不清楚pl的声明位置,但您应该考虑程序的结构。

答案 1 :(得分:2)

您继续将相同的对象(this)添加到列表中。虽然您更改了成员,但列表中的所有引用都会引用相同的对象。

您应该创建一个新对象并添加它。

查看我的其他帖子

答案 2 :(得分:1)

尝试

ProductList obj=new ProductList();
// some work on this object and then store it in List
pl.add(obj);

它应该有用,因为它会给你新鲜的对象

答案 3 :(得分:1)

我试图从这里发布的内容猜测ProductList和Product的整体结构。问题是列表元素的列表和字段看起来是在单个类的上下文中,即ProductList。这不行 - 需要两个类。

// stores the data coming from a single Element ("item") of the document
class Product {
    private String productType;
    private String hyperLinkParam;
    public setHyperLinkParam( String hlp ){
        hyperLinkParam = hlp;
    }
    public setProductType( String pt ){
        productType = pt;
    }
}

// Container for a list of products from an inventory
class ProductList {
    private ArrayList <Product> pl = new ArrayList<Product> ();
    public ProductList() {
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        DocumentBuilder db = dbf.newDocumentBuilder();
        InputStream url = getClass().getResourceAsStream("inventory.xml");
        Document doc = db.parse(url);
        doc.getDocumentElement().normalize();

        // loop through each item
        NodeList items = doc.getElementsByTagName("item"); 
        for (int i = 0; i < items.getLength(); i++){
            Element e = (Element) items.item(i);
            // create the single product from the current item
            Product prod = new Product();
            prod.setHyperLinkParam( e.getAttribute("name").toString() );
            prod.setProductType( getTextValue( e, "productType") );
            // add it to the list
            pl.add( prod );
        }
    }

    void showList(){
        for( Product prod: pl ){
        System.out.print("getHyperLinkParam: " + prod.getHyperLinkParam());
            System.out.println("getProductType: " + prod.getProductType());
        }
    }
}

注意:如果ProductList和Product的构造位于带有工厂方法makeProductList和makeProduct的Factory类中,那么一切都会更清晰,更清晰。 ProductList应该有一个方法addProduct将add添加到其pl成员。如何从XML获取产品列表的知识应该在构造函数中那里,并且类似地,获得产品的字段值的方式来自“item”元素不属于Product或ProductList的代码。