2013-04-20 40 views
0

我在学习Java方面还很新,我需要一种方法将从某个类构造而来的每个对象放入一个ArrayList中,以便稍后访问。自动添加构造到ArrayList中的每个Class对象

这里是我Item类:

import java.util.ArrayList; 
import java.util.*; 
public class Item 
{ 
    private String name; 
    private int quantity; 
    private ArrayList<Item> allItems = new ArrayList<Item>(); //the ArrayList I'm trying to fill with every Item object 

    /** 
    * Constructs an item of a given name and quantity 
    * @param name Item name 
    * @param quantity How much of an item the player has 
    */ 
    public Item(String name, int quantity) 
    { 
     this.name = name; 
     this.quantity = quantity; 
    } 

    /** 
    * @return Item name 
    */ 
    public String getItemName() 
    { 
     return name; 
    } 

    /** 
    * @return Quantity of the item 
    */ 
    public int getQuantity() 
    { 
     return quantity; 
    } 

    /** 
    * @return A list of items that have a quantity > 0 
    */ 
    public ArrayList<Item> getInventory() 
    { 
     ArrayList<Item> inventory = new ArrayList<Item>(); 
     for(Item i : allItems) 
     { 
      if(i.getQuantity() > 0) 
       inventory.add(i); 
     } 
     return inventory; 
    } 
} 

我怎样才能每一次添加一个Item对象allItems构建的是?

+1

作为友好评论,总是试图使用接口,而不是实现,所以不用返回ArrayList的返回列表,并且在创建,任务列表 myList中=新的ArrayList ()。原因?如果将来您使用列表接口的不同实现(如LinkedList),则只需更改几行即可。 – 2013-04-20 12:25:38

回答

3

首先,所以它是所有实例之间共享的arraylis必须是静态的。 否则,每个实例都会有不同的变量。

有关实例/班级成员here的更多信息。

private String name; 
private int quantity; 
private static ArrayList<Item> allItems = new ArrayList<Item>(); 

然后,您可以在构造函数中添加创建的实例,将其称为“this”。

About the 'this' keyword

public Item(String name, int quantity) 
{ 
    this.name = name; 
    this.quantity = quantity; 
    allItems.add(this); 
} 
+0

upvoted这只是因为它是唯一一个(除了我的)这解释了什么'静态'关键字实际上做。 – Philipp 2013-04-20 10:19:09

+0

谢谢,它工作完美 – colinbr96 2013-04-20 10:42:44

0

一个可能的解决方案是申报的项目列表作为静态这样的:另外在你的构造函数,你需要

Item.allItems // example would be System.out.println(Item.allItems) 

public static List<Item> allItems = new ArrayList<Item>(); 

之后,你可以使用下面的代码片断访问以下代码:

public Item(String name, int quantity) { 
    this.name = name; 
    this.quantity = quantity; 
    this.allItems.add(this); 
} 

但是请谨慎使用此方法,因为它会添加列出所创建的每个项目,可能会导致可能的内存泄漏。

1

您当然希望为所有项目列出一个列表,而不是每个项目都携带并维护其自己的所有项目的副本列表。如果这是你的意图,你应该定义列表为static

private static ArrayList<Item> allItems = new ArrayList<Item>() 

静态变量是由类的所有实例共享。

在项目的构造函数中,只需将this添加到所有项目的列表中。

allItems.add(this); 
0

您需要一个静态列表,然后您可以使用类构造函数将此对象添加到列表中。

import java.util.ArrayList; 
import java.util.*; 
public class Item 
{ 
    private String name; 
    private int quantity; 
    private static ArrayList<Item> allItems = new ArrayList<Item>(); //the ArrayList I'm trying to fill with every Item object 

    /** 
    * Constructs an item of a given name and quantity 
    * @param name Item name 
    * @param quantity How much of an item the player has 
    */ 
    public Item(String name, int quantity) 
    { 
     this.name = name; 
     this.quantity = quantity; 
     allItems.add(this); 
    } 

    /** 
    * @return Item name 
    */ 
    public String getItemName() 
    { 
     return name; 
    } 

    /** 
    * @return Quantity of the item 
    */ 
    public int getQuantity() 
    { 
     return quantity; 
    } 

    /** 
    * @return A list of items that have a quantity > 0 
    */ 
    public static ArrayList<Item> getInventory() 
    { 
     ArrayList<Item> inventory = new ArrayList<Item>(); 
     for(Item i : allItems) 
     { 
      if(i.getQuantity() > 0) 
       inventory.add(i); 
     } 
     return inventory; 
    } 
}