创建ArrayList并添加项目

时间:2011-02-17 20:01:24

标签: java arraylist

我正在学习Java并遇到ArrayList问题。

首先,我有一个名为Item的类,用它创建各种项目对象。 然后我有一个类目录,它是一个数组列表,应该包含我创建的项目对象的列表。 目前,我可以通过在Catalog对象上调用addItem方法并手动输入要添加的项目对象的名称(item1 item2 item3等)来手动将项目添加到目录中。 但我想知道每次创建项目对象时是否有自动将项添加到ArrayList的方法?

我应该提一下,我的列表需要保存无限量的项目,因此我没有在代码中指定大小。 任何帮助将不胜感激 :) 感谢

import java.util.ArrayList;

public class Catalogue
{
   private ArrayList<Item> catalogue;

    public Catalogue ()
    { 
      catalogue = new ArrayList<Item>();
    }


    public void addAnItem(Item item)
    {
      catalogue.add(item);
    }
}

3 个答案:

答案 0 :(得分:4)

Catalogue用作Item工厂:

public class Catalogue
{
  ...

  public Item createItem()
  {
    Item item = new Item();
    catalogue.add(item);
    return item;
  }

  ...
}

另一种方法:制作Catalogue单身,让物品自行添加。

答案 1 :(得分:3)

您可以这样做的一种方法是将Catalog传递给Item类的构造函数,并在项目设置完成后,将该项添加到目录中。

它可能看起来像这样

public Item(Catalogue catalogue) {
   // set up item here

   // finally add item to the catalogue
   catalogue.addAnItem(this);
}

答案 2 :(得分:1)

我已经对Matten和Codemwnci的答案发表了一些评论,以下是对它们的解释。

Codemwnci建议您不应在不设置目录的情况下构建项目。

public class Item {
 public Item(Catalog catalog) {
   // set up item here

   // finally add item to the catalog
   catalog.addAnItem(this);
 }
}

此显式构造函数删除了隐式默认(no-arg)构造函数,如果没有有效的非空目录,则无法构造Item。

如果您有各种类型的项目,(略微)不同的行为,您可能会更好地使用Matten的答案(虽然这里稍作修改)。

作为一个例子,我正在使用一本书(这是你的物品)。我的书有标题,作者,textAtTheBack和重量。

interface Book {
  String getTitle();
  String getAuthor();
  String getTextAtTheBack();
  Long getWeight(); // in grams, can be very heavy!
}

public class Catalog {
  private ArrayList<Book> catalogue;
  public Book createPaperback(final String title, final String author, 
                              final String tatb, final Long weight) {
    Book b = new Book() {
      String getTitle() { return title; }
      String getAuthor() {return author; }
      String getTextAtTheBack() {return tatb;}
      Long getWeight() {return weight;}
    }
    catalogue.add(b);
    return b;
  }

  public Book createEBook(final String title, final String author, 
                              final String tatb) {
    Book b = new Book() {
      String getTitle() { return title; }
      String getAuthor() {return author; }
      String getTextAtTheBack() {return tatb;}
      Long getWeight() {return 0;} // Yep - no weight!
    }
    catalogue.add(b);
    return b;
  }
}

或者,您可以使用不同的目录:

public abstract class Catalogue {
    private final List<Book> books = new ArrayList<Book>;

    public abstract Book (final String title, final String author, 
                              final String tatb, final Long weight);

    /** Find the book with the given title (not null) in the current catalogue.
     * @return the book, or null if not found.
     */
    public void findBook(String title) {
        for (Book b : books) {
           if (b.getTitle().equalsIgnoreCase(title)) {
               return b;
           }
        }
        return null;
    }

    protected void addBookToCatalogue(Book b) {
        books.add(b);
    }
}

public class EbookCatalogue extends Catalogue {
    public Book (final String title, final String author, 
                              final String tatb, final Long weight) {
      Book b = new Book() {
        String getTitle() { return title; }
        String getAuthor() {return author; }
        String getTextAtTheBack() {return tatb;}
        Long getWeight() {return 0;} // ignore weight
      }
      addBookToCatalogue(b);
      return b;
    }
}

在程序的其余部分中,您可以拥有多个目录,每个目录的书籍类型略有不同,但程序无需知道。

我认为在这种情况下,codemwnci的简单构造函数是最好的,但如果您的情况需要更灵活的解决方案,那么还有替代解决方案。