Spec-Zone .ru
спецификации, руководства, описания, API
|
Следующие правила определяют простую стратегию создания неизменных объектов. Не все классы, задокументированные как "неизменный", следуют за этими правилами. Это не обязательно означает, что создатели этих классов были неаккуратны — у них может быть серьезное основание для того, чтобы полагать, что экземпляры их классов никогда не изменяются после конструкции. Однако, такие стратегии требуют сложного анализа и не для новичков.
final
и private
.final
. Более сложный подход должен сделать конструктора private
и создайте экземпляры в методах фабрики.Применение этой стратегии к SynchronizedRGB
результаты в следующих шагах:
set
, произвольно преобразовывает объект, и не имеет никакого места в неизменной версии class. Второй, invert
, может быть адаптирован при наличии, оно создает новый объект вместо того, чтобы изменить существующий.private
; они далее квалифицируются как final
.final
.После этих изменений мы имеем
: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); } }