自动添加构造到ArrayList中的每个Class对象

时间:2013-04-20 10:10:45

标签: java class object arraylist

我在学习Java方面仍然相当新,我需要一种方法将从某个类构造的每个对象放入我稍后可以访问的ArrayList中。

这是我的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}}?

4 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:1)

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

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

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

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

allItems.add(this);

答案 2 :(得分:0)

一种可能的解决方案是将项目列表声明为静态,如下所示:

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

之后您可以使用以下代码段访问它:

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

此外,在构造函数中,您将需要以下代码:

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

谨慎使用此方法,因为它会将每个创建的项目添加到列表中,这可能会导致内存泄漏。

答案 3 :(得分:0)

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

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