Ошибка инициализации в конструкторе

178
05 февраля 2018, 04:47

Добрый день. Есть класс Boy.

package com.epam.gomel.homework;
import lombok.Getter;
import lombok.Setter;
public class Boy extends Human {
    @Getter
    private Month birthdayMonth;
    @Getter
    @Setter
    private Girl girlFriend;
    @Getter
    private double wealth;
    public Boy(Month birthdayMonth, double wealth, Girl girlFriend) {
        this.birthdayMonth = birthdayMonth;
        this.wealth = wealth;
        this.girlFriend = girlFriend;
        this.girlFriend.setBoyFriend(this);
    }
    public Boy(Month birthdayMonth, double wealth) {
        this(birthdayMonth, wealth, null);
    }
    public Boy(Month birthdayMonth) {
        this(birthdayMonth, 0, null);
    }
    @Override
    public Mood getMood() {
        if (isRich() && isPrettyGirlFriend() && isSummerMonth()) {
            return Mood.EXCELLENT;
        } else if (isRich() && isPrettyGirlFriend()) {
            return Mood.GOOD;
        } else if (isRich() && isSummerMonth()) {
            return Mood.NEUTRAL;
        } else if (isRich() || isPrettyGirlFriend() || isSummerMonth()) {
            return Mood.BAD;
        }
        return Mood.HORRIBLE;
    }
    public void spendSomeMoney(double amountForSpending) {
        if (amountForSpending <= getWealth()) {
            wealth += amountForSpending;
        } else {
            throw new RuntimeException(String.format("Not enough money! Requested amount is %s$ but you can't spend more then %s$", amountForSpending, getWealth()));
        }
    }
    public boolean isSummerMonth() {
        return Month.JUNE.equals(getBirthdayMonth()) || Month.JULY.equals(getBirthdayMonth()) && Month.AUGUST.equals(getBirthdayMonth());
    }
    public boolean isRich() {
        return getWealth() >= 1_000_000;
    }
    public boolean isPrettyGirlFriend() {
        return getGirlFriend() != null && getGirlFriend().isPretty();
    }
}

В нем конструторы с разными аргументами. такой же есть класс Girl. Когда используешь конструкторы в которых не полная инициализация полей, выбрасывается ошибка NullPointerException.

Т.Е. здесь this.girlFriend = girlFriend; инициализируется null и когда начинается инициализация следующего поля this.girlFriend.setBoyFriend(this); соответственно выбрасывается ошибка. Есть ли здесь нормальный способ исправить это в самом конструторе или может нужно создать метод для проверки на null и уже через него инициализировать. Подскажите пожалуста как здесь лучше сделать?

Answer 1

Как по мне, то лучше сделать так:

public Boy(Month birthdayMonth, double wealth) {
        this.birthdayMonth = birthdayMonth;
        this.wealth = wealth;
    }
    public Boy(Month birthdayMonth) {
        this.birthdayMonth = birthdayMonth;
    }

но есть несколько нюансов. Во-первых, наличие поля в экземпляре, содержащее null, потенциально может привести к ошибкам и излишним проверкам. Во-вторых, конструкция this.girlFriend.setBoyFriend(this); мягко говоря мозолит глаз. Классы Boy и Girl находятся на одном уровне абстракции и влияние друг на друга должно осуществляться через некоего "менеджера".

READ ALSO
обработка нажатий клавиш java [требует правки]

обработка нажатий клавиш java [требует правки]

как обработать нажатия клавиш в java?

134
Взаимодействие if и for

Взаимодействие if и for

Добрый деньПроблема состоит в том, что программа должна получить 0

163
Сохранение скачанного файла Android

Сохранение скачанного файла Android

Цель: скачать файл и сохранить в папке Downloads При попытке открыть файл для записи таким способом

184
Метод выполняющийся при коллизий box2d

Метод выполняющийся при коллизий box2d

Использую libgdx + box2dОбрабатываю коллизию тел через ContactListener, но для него приходится делать очень много проверок

195