При выполнении следующего кода класс yearofBirth of Author становится нулевым? - PullRequest
0 голосов
/ 20 января 2020

enter image description here Когда я проверяю год рождения автора из переменной hp и проверяю объект ... он показывает ноль как год рождения, но в переменной jkr вместо года он отображается как 1965 нуля Почему он показывает ноль через hp, и как я могу получить вместо него отображение yearofBirth?

Вот что я выполнил: 1-й:

Author jkr = new Author("JK Rowling", "1965");

yearOfBirth показывает нормально, когда проверка переменной

Тогда:

Book hp = new Book("Harry Potter and the Philosophers Stone",
                   "1997",
                   new Author("JK Rowling"));

yearOfBirth отображается как null при проверке? И я хочу, чтобы код книги отображался как

, например: Название: Гарри Поттер, Автор: Дж. К. Роулинг ** (род. 1900) ** ... с yearOfBirth

Ответы [ 2 ]

0 голосов
/ 21 января 2020

Поскольку не нужно указывать год рождения в каждой книге, нужен поиск:

Authors authors = new Authors();
Book hp = new Book("Harry Potter and the Philosophers Stone",
                   "1997",
                   authors.findByName("JK Rowling"));

Упрощенная c реализация:

public class Authors {
    Map<String, Author> mapByName = new HashMap<>();

    public Authors() {
        addAuthor("JK Rowling", "1965");
    }

    private void addAuthor(String name, String yearOfBirth) {
        mapByName.put(name, new Author(name, yearOfBirth));
    }

    public Author findByName(String name) throws NoSuchElementException {
         return Optional.ofNullable(mapByName.get(name))
                 .orElseThrow(() -> new NoSuchException(name);
    }
}
0 голосов
/ 20 января 2020
Book hp = new Book("Harry Potter and the Philosophers Stone",
                   "1997",
                   new Author("JK Rowling"));

В этом случае вы не инициализируете yearOfBirth в конструкторе Author, поэтому это поле будет принимать значение, которое вы указали в конструкторе с одним аргументом, то есть null.

public Author (String aName) {
       this.name = aName;
       this.yearOfBirth = null; // <--- HERE
}

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

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