{{X0}} относится к {{X1}}, а не к любому другому оружию. Учитывая, что в моем подклассе есть два конструктора, а не дважды набирать {{X2}}, могу ли я вызвать для этого {{X3}}? Причина в том, что если мои атрибуты для ChargeGun вырастут, мне придется добавить атрибуты в оба конструктора. Если я сделаю это частным методом final, все будет установлено в одном месте. Это плохая практика?

Допустим, у меня есть следующий подкласс :

private boolean isActive;

public ChargeGun(String gameObjectID, String gameObjectName, String desc, int numberofshots, int damage, boolean isActive) {
    super(gameObjectID, gameObjectName, desc, numberofshots, damage);

    setAttributes(isActive);

}

public ChargeGun(String gameObjectID, String gameObjectName, int numberofshots, int damage, boolean isActive) {
    super(gameObjectID, gameObjectName, numberofshots, damage);

    setAttributes(isActive);

}

private final void setAttributes(boolean isActive)
{
    this.isActive = isActive;
}

Вам не нужно использовать параметр --exclude, потому что этот ключ используется только для пропуска неотслеживаемых файлов:

Я не могу связать конструкторы ChargeGun, потому что оба вызывают конструктор суперклассов.

1
user6232135 20 Апр 2016 в 22:41

2 ответа

Лучший ответ

Метод private не может быть переопределен, вам также не нужно отмечать его final (что также означает, что он не может быть переопределен). Достаточно одного из final или private. Однако метод необходимо немного изменить. Подобно,

private void setAttributes(boolean isActive)
{
    this.isActive = isActive;
}

Ваша версия всегда устанавливает значение true. Если это намеренно , я бы полностью удалил установщик и сделал что-то вроде

private final boolean isActive = true;

Я знаю, что вы можете вызвать метод из конструктора, но это может привести к проблемам позже, если метод может быть переопределен. Следующий код - это всего лишь пример, который я написал, демонстрирующий мою проблему:

5
Elliott Frisch 20 Апр 2016 в 19:46

Если вам нужны ваши setAttributes, это, безусловно, означает, что у вас есть общие переменные, которые всегда устанавливаются одинаково в нескольких конструкторах. Разве не было бы более понятным иметь «полный конструктор», который имеет все назначения, которые вы делаете в setAttributes, и другие более короткие версии вашей версии, вызывающие полную версию?

Кроме того, вам действительно стоит подумать об использовании шаблона Builder, который явно имеет дело с теми объектами, которые могут быть построены во многих различные пути. Если вам кажется, что это много работы, просто знайте, что некоторые плагины для IDE, такие как InnerBuilder упростить создание. Если вы посмотрите, как развиваются языки, вы увидите все больше и больше конструкторских API (Stream, Optional ...).

0
Jonathan Schoreels 20 Апр 2016 в 19:51