Хранение объекта внутри объекта - PullRequest
3 голосов
/ 07 декабря 2011

Со времени моего вчерашнего сообщения о создании списка ссылок с нуля я добился определенного прогресса.

Я столкнулся с новым препятствием: хранение объекта внутри объекта.

Допустим, у меня есть класс 'book' со следующими атрибутами (забывая обо всех методах set & get, с которыми я знаком):

 private String title;
 private int rating;

Как бы я тогда ссылался на другой класс, такой как «автор», поскольку очевидно, что у книги должен быть автор, а во многих книгах может быть один или несколько авторов.

Вот мои атрибуты класса 'автора' (снова игнорируя get & sets):

 String authorName;
 String authorEmail;

Правильно ли я считаю, что мне нужно инициировать объект 'author' в классе 'book' как таковой:

 private String title;
 private int rating; //mine
 private Author author = new Author();

Придется ли мне устанавливать атрибуты authorName и authorEmail каждый раз, когда я создаю новый экземпляр 'book'?

Заранее большое спасибо за конструктивную обратную связь.

Ответы [ 4 ]

1 голос
/ 07 декабря 2011

Вам не обязательно создавать экземпляр объекта Author прямо там, где вы объявляете атрибут. Я бы предложил что-то вроде передачи уже созданного экземпляра Author либо конструктору класса Book, либо установщику. Затем вы можете передать одного и того же автора в каждую созданную вами книгу, которая должна быть связана с ней.

РЕДАКТИРОВАТЬ: добавлены некоторые фрагменты кода:

Например, если вы сделали конструктор Book примерно таким:

public Book(String title, int rating, Author author) {
    // set this.title, this.rating, and this.author to the passed-in parameters...
}

Тогда вы вызываете его в коде, подобном следующему:

Author bob = new Author(); 
// You can set the name and email of the Author here using setters,
//   or add them as args in the Author constructor
Book firstBook = new Book("The First Book", 1, bob);
Book secondBook = new Book("The Second Book", 2, bob);
0 голосов
/ 07 декабря 2011

Вы на правильном пути. Вы можете использовать ArrayList, чтобы иметь возможность динамически добавлять новых авторов без изменения размера. Позвольте мне уточнить это для вас:

class Book {
    private String title;
    private int rating;
    private List<Author>authors = new ArrayList<Author>();


    public Book(String title, int rating, Author author) {
        this.title = title;
        this.rating = rating;
        authors.add(author);
    }

    public Book(String title, int rating, Author author) {
        this.title = title;
        this.rating = rating;
        this.author = author;
    }

    public void addAuthor(Author a) {
        authors.add(a);
    }

    public int numberOfAuthors() {return authors.size();}
}
class Author {
    private String name;
    private String email;

    public Author(String name, String email) {
        //...Same thing
    }
}
class Main {
    public static void main(String[] args) {
        Book book = new Book("Java Programming", 5, new Author("Me", "me@gmail.com"));
        Author contributingAuthor = new Author("My Friend", "cupcakes@gmail.com");
        book.addAuthor(contributingAuthor);
    }
}
0 голосов
/ 07 декабря 2011

Возможно, вам понадобится какой-то один список авторов, чтобы предотвратить копирование одного и того же автора.Либо так, либо вам обязательно нужно переопределить метод equals автора.

Если вы используете синглтон, у вас может быть подпрограмма getAuthor в вашем объекте AuthorList, которая либо делает автора, если он не существует, либоизвлекает уже созданного автора.

0 голосов
/ 07 декабря 2011

Это отношение многих ко многим.Ваш класс Author должен быть просто связующим звеном между человеком и книгой.Тогда все получится.

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