Spec-Zone .ru
спецификации, руководства, описания, API
След: Существенные Классы
Урок: Параллелизм
Раздел: Неизменные Объекты
Стратегия Определения Неизменных Объектов
Домашняя страница > Существенные Классы > Параллелизм

Стратегия Определения Неизменных Объектов

Следующие правила определяют простую стратегию создания неизменных объектов. Не все классы, задокументированные как "неизменный", следуют за этими правилами. Это не обязательно означает, что создатели этих классов были неаккуратны — у них может быть серьезное основание для того, чтобы полагать, что экземпляры их классов никогда не изменяются после конструкции. Однако, такие стратегии требуют сложного анализа и не для новичков.

  1. Не обеспечивайте методы "метода set" — методы, которые изменяют поля или объекты, упомянутые полями.
  2. Сделайте все поля final и private.
  3. Не позволяйте подклассам переопределять методы. Самый простой способ сделать это должно объявить class как final. Более сложный подход должен сделать конструктора private и создайте экземпляры в методах фабрики.
  4. Если поля экземпляра включают ссылки на изменчивые объекты, не позволяйте тем объектам быть измененными:
    • Не обеспечивайте методы, которые изменяют изменчивые объекты.
    • Не совместно используйте ссылки на изменчивые объекты. Никогда не храните ссылки на внешние, изменчивые объекты, которые передают конструктору; в случае необходимости создайте копии, и сохраните ссылки на копии. Точно так же создайте копии своих внутренних изменчивых объектов когда необходимо, чтобы избежать возвращать оригиналы в Ваших методах.

Применение этой стратегии к SynchronizedRGB результаты в следующих шагах:

  1. В этом class есть два метода метода set. Первый, set, произвольно преобразовывает объект, и не имеет никакого места в неизменной версии class. Второй, invert, может быть адаптирован при наличии, оно создает новый объект вместо того, чтобы изменить существующий.
  2. Все поля уже private; они далее квалифицируются как final.
  3. САМ class объявляется final.
  4. Только одно поле обращается к объекту, и что объект является самостоятельно неизменным. Поэтому, никакие гарантии против изменения состояния "содержавших" изменчивых объектов не необходимы.

После этих изменений мы имеем ImmutableRGB:


final public class ImmutableRGB {

    // Values must be between 0 and 255.
    final private int red;
    final private int green;
    final private int blue;
    final private String name;

    private void check(int red,
                       int green,
                       int blue) {
        if (red < 0 || red > 255
            || green < 0 || green > 255
            || blue < 0 || blue > 255) {
            throw new IllegalArgumentException();
        }
    }

    public ImmutableRGB(int red,
                        int green,
                        int blue,
                        String name) {
        check(red, green, blue);
        this.red = red;
        this.green = green;
        this.blue = blue;
        this.name = name;
    }


    public int getRGB() {
        return ((red << 16) | (green << 8) | blue);
    }

    public String getName() {
        return name;
    }

    public ImmutableRGB invert() {
        return new ImmutableRGB(255 - red,
                       255 - green,
                       255 - blue,
                       "Inverse of " + name);
    }
}

Проблемы с примерами? Попытайтесь Компилировать и Выполнить Примеры: FAQ.
Жалобы? Поздравление? Предложения? Дайте нам свою обратную связь.

Предыдущая страница: Синхронизируемый Пример Класса
Следующая страница: Высокоуровневые Объекты Параллелизма