Добрый день. Есть класс 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 и уже через него инициализировать. Подскажите пожалуста как здесь лучше сделать?
Как по мне, то лучше сделать так:
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
находятся на одном уровне абстракции и влияние друг на друга должно осуществляться через некоего "менеджера".
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Цель: скачать файл и сохранить в папке Downloads При попытке открыть файл для записи таким способом
Использую libgdx + box2dОбрабатываю коллизию тел через ContactListener, но для него приходится делать очень много проверок