Создание ArrayList и добавление элементов - PullRequest
2 голосов
/ 17 февраля 2011

Я изучаю Java и у меня возникли проблемы с ArrayList.

Во-первых, у меня есть класс Item, с помощью которого я создаю различные объекты item. Затем у меня есть класс Catalog, который является списком массивов и должен содержать список объектов предметов, которые я создаю. В настоящее время я могу вручную добавить элементы в каталог, вызвав метод addItem для объекта Catalog и вручную введя имя объекта item, который я хочу добавить (item1 item2 item3 и т. Д.) Но я хотел знать, есть ли способ автоматически добавлять элементы в ArrayList каждый раз, когда я создаю объект item?

Я должен отметить, что мой список должен содержать бесконечное количество элементов, поэтому я не указал размер в своем коде. Любая помощь будет принята с благодарностью :) Спасибо

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 ]

4 голосов
/ 17 февраля 2011

Используйте Catalogue как Item фабрику:

public class Catalogue
{
  ...

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

  ...
}

Другой подход: сделать Catalogue синглтон и позволить элементам добавлять себя.

3 голосов
/ 17 февраля 2011

Один из способов сделать это можно, если вы передали каталог в конструктор класса Item и, как только элемент настроен, добавьте его в каталог в этой точке.

Это может выглядеть примерно так

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

   // finally add item to the catalogue
   catalogue.addAnItem(this);
}
1 голос
/ 17 февраля 2011

Я добавил несколько комментариев к ответам Маттена и Кодемунси, и вот их объяснение.

Кодмунци предлагает, чтобы вы не могли создавать Предмет без настройки его каталога.

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

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

Этот явный конструктор удаляет неявный конструктор по умолчанию (no-arg), и вы не можете создать Item, если у него нет действительного ненулевого каталога.

Если у вас есть различные типы элементов, с(немного) другое поведение, возможно, вам лучше ответить ответом Маттена (хотя и немного изменили здесь).

В качестве примера я использую Книгу (которая является вашим Предметом).Моя книга имеет название, автора, 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;
    }
}

В остальной части программы вы можете иметь несколько каталоговКаждый из них имеет несколько различный тип Book, но программа не должна этого знать.

Я думаю, что в этом случае лучше всего использовать простой конструктор codemwnci, ​​но есть альтернативные решения, если ваша ситуация требует более гибкого решения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...