Я добавил несколько комментариев к ответам Маттена и Кодемунси, и вот их объяснение.
Кодмунци предлагает, чтобы вы не могли создавать Предмет без настройки его каталога.
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, но есть альтернативные решения, если ваша ситуация требует более гибкого решения.