Как расширить неизменяемые типы в Java

Я начал экспериментировать с неизменяемыми объектами-значениями в Java во время работы над игровым проектом, следуя подходу «открытых конечных полей» :

public class Team {
    public final String name, flag;

    public Team(String name, String flag) {
        this.name = name;
        this.flag = flag;
    }
}

. Пока это работает довольно хорошо для меня, но мне нужны разные наборы дополнительной информации о команде в разных обстоятельствах. Например, у команды есть установленный цвет во время матча. Вопрос в том, как лучше всего работать с этими наборами расширенной информации? Я знаю, что это довольно общий вопрос, но я хочу продолжать использовать неизменяемые объекты, и это может повлиять на решение.

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

Вариант 1 :Все одним классом

public class Team {
    public final String name, flag, colorName;
    public final int colorRgb;

    public Team(String name, String flag, String colorName, int colorRgb) {
        this.name = name;
        this.flag = flag;
        this.colorName = colorName;
        this.colorRgb = colorRgb;
    }
}

Это требует только одного класса для всех применений, но нет основанного на типе -указания того, какие дополнительные данные ожидаются/предоставляются.

Вариант 2 :Подклассы

public class TeamWithColor extends Team {
    public final String colorName;
    public final int colorRgb;

    public Team(String name, String flag, String colorName, int colorRgb) {
        super(name, flag);
        this.colorName = colorName;
        this.colorRgb = colorRgb;
    }
}

Это может сделать невозможным реализацию на основе контента -equals ().

Вариант 3 :Состав

public class TeamWithColor {
    public final Team team;
    public final String colorName;
    public final int colorRgb;

    public Team(Team team, String colorName, int colorRgb) {
        this.team = team;
        this.colorName = colorName;
        this.colorRgb = colorRgb;
    }
}

Меньше копирования / шаблонного кода, если данные команды и дополнительные данные часто меняются независимо.

Вариант 4 :Пара/кортеж (с использованием неизменяемого класса Pair)

public class TeamColor {
    public final String colorName;
    public final int colorRgb;

    public Team(String colorName, int colorRgb) {
        this.colorName = colorName;
        this.colorRgb = colorRgb;
    }
}

Pair<Team, TeamColor> teamWithColor = Pair.create(team, teamColor);

... или с пользовательским классом, который связывает Team и TeamColor вместе.

Я склоняюсь к варианту 3 или 4, но меня интересуют ваши мнения, аргументы и интуиция:)

9
задан Adi Lester 4 August 2012 в 18:22
поделиться