Test the best
Порой атмосфера в компьютерной лаборатории напоминает собой библиотеке...
далее
Сегодня нашими собеседниками являются ведущие разработчики белорусской...
далее
У сегодняшнего лидера рейтинга TTB Алексея Данченко aka DAle сейчас до...
далее
 
 
люди
разное
СПОНСОРЫ
EPAM Systems
генеральный спонсор
ServiceWare Technologies
ПАРТНЕРЫ
белорусский портал TUT.by
революционная баннерная сеть Red.by
"Компьютерные Вести On-line"
Спонсор доступа в интернет компания Solo
портал белорусских программистов
Первый Белорусский Linux-портал
СТАТЬИ / техника
  Даже шимпанзе могут писать код

Пристальный взгляд на неизменные объекты

Все мы слышали о неизменных объектах, но некоторые всё еще не знают, что они собой представляют, и уж совсем мало кто умеет их создавать.

Что на самом деле подразумевается под словом неизменный?

Типичный объект (например, JavaBean) – непостоянен, то есть подвержен действию непостоянных методов (setters), которые позволяют вам вносить изменения в их контент на протяжении всего жизненного цикла объекта. Неизменный подразумевает собой тот, который нельзя поменять. Содержание неизменного объекта, определенное единожды, не может быть отредактировано. Например, в Java классы String, Exception, URL, Character, Byte, Integer, Short, Long, Float и Double являются неизменными.

Для чего нам нужны неизменные объекты?

Неизменные объекты обеспечивают большую безопасность. Они могут быть использованы в многочисленных потоках без риска, что их содержание поменяется без вашего ведома. Такое бесконфликтное поведение делает их идеальными компонентами для кэша и даже для постоянных величин. Давайте рассмотрим в качестве примера класс String. В некоторых языках и программных интерфейсах приложений (которые мы не будем называть, чтобы их не позорить) предусмотрена возможность просмотра массива символов. Работая с таким методом (или функцией), получившим этот объект в качестве независимой переменной, вы должны скопировать его в локальную переменную, чтобы обезопасить себя от изменений в содержании, которые могут случиться без вашего ведома. Вы также не можете сделать предположений о времени существования этого объекта. Это становится причиной ненужного копирования объекта, которое вы совершаете, потому что не уверены, что контролируете ситуацию в месте его изначального хранения. С использованием неизменных объектов вопрос о том, кто имеет право вносить изменения, а кто нет, снимается.

Одна из причин, почему класс String был сделан неизменным, - это соображения безопасности. Вы используете метод открытия файлов. Вы вводите параметр String. А потом делаете всевозможные проверки аутентификации, пока дело не дойдет до отсылки запросов к операционной системе. Если вам удается сделать что-то, что видоизменяет значение String, после проверки безопасности и до запроса к операционной системе, то – бум – и вы внутри. Но класс String является неизменным, поэтому возможности таких атак исключены. Этот пример и показывает, почему String’и должны быть неизменными.

Как создать неизменный объект?

...начав с неизменного класса (сюрприз, сюрприз!). Спокойнее, не нервничайте, сейчас все расскажу... Как обсуждалось выше, мы можем начать с того что удостоверимся, что класс не имеет методов set. Также обратите внимание на то, что тут не должно быть и общедоступных полей. Ведь вам же не нужны «потайные ходы»?

Получается следующее:

// наш бесстрашный неизменный класс
 
public class StrongAndResoluteLeader {
    
private DomesticPolicy dp;
    
private ForeignPolicy fp;

    
public StrongAndResoluteLeader(DomesticPolicy dp,
                                   
ForeignPolicy fp) {
         
this.dp = dp;
        
this.fp = fp;
     }  

    
public DomesticPolicy getDomesticPolicy() {
        
return this.dp;
     }

    
public ForeignPolicy getForeignPolicy() {
        
return this.fp;
     }
 
    
// никаких непостоянных методов!

}


Хмм, выглядит неплохо! Но если кто-то придет и создаст подкласс FlipFlopper, добавив такие изменяемые методы как setDomesticPolicy и setForeignPolicy, это может означать погибель всей затеи! Вы, конечно, можете ввести класс final и тоже закрыть дыру. Было бы просто (и очень заманчиво) расквитаться на этом этапе. Проблема в том, что если классы DomesticPolicy и ForeignPolicy не являются неизменными сами по себе, нас ожидают большие трудности. И это была бы очень невеселая ситуация. Позвольте вам продемонстрировать:

DomesticPolicy dp = new DomesticPolicy();
   ForeignPolicy fp = new ForeignPolicy();

   StrongAndResoluteLeader w =
                       new StrongAndResoluteLeader(dp, fp);  
  

   //
но позже...
  
// DomesticPolicy изменяем, так что мы спокойно можем сделать следующее   dp.setFiscalPlan(newEconomicPlan);

А сейчас мы можем либо убедиться в том, что DomesticPolicy является неизменным, либо быть более реалистичными и создать некоторые дополнительные меры предосторожности.

// и вот он наш усовершенствованный бесстрашный неизменный класс
public class StrongAndResoluteLeader {
    
private DomesticPolicy dp;
    
private ForeignPolicy fp;
    
public StrongAndResoluteLeader(DomesticPolicy dp,
                                   
ForeignPolicy fp) {

        
// лучше скопируйте, чем используйте сразу

         this.dp = new DomesticPolicy(dp.getFiscalPlan(),
                                     
dp.getSecurityPlan());
        
this.fp = fp;
     }  
    
public DomesticPolicy getDomesticPolicy() {
        
// верните детальную копию, а не оригинал
        
return new DomesticPolicy(this.dp.getFiscalPlan(),
                                  
this.dp.getSecurityPlan());
     }

    
public ForeignPolicy getForeignPolicy() {
        
return this.fp;
     }
 
    
// и никаких непостоянных методов!

Создав детальные копии непостоянного объекта класса DomesticPolicy, мы обезопасим наш неизменный класс StrongAndFearlessLeader от отклонения от нужного направления. Именно так и создаются на самом деле неизменные объекты.

Обсудить на форуме.


Источник: Nerddawg.Blogspot.com


  все статьи раздела "техника"

назад на все статьи   

РЕКЛАМА
ВХОД
Логин:
Пароль:
Регистрация
Забыли пароль?
ОПРОС
Что является основным стимулом для игры на TTB?

приз
попасть в рейтинг
интерес
поупражнять мозги
слава :)
OK
все опросы
РЕЙТИНГ
1.   DAle -  328
2.   Zis -  300
3.   forest -  270
4.   HeaDacHe -  226
5.   Orlangur -  213
6.   Punk -  170
7.   Crush -  167
8.   may -  114
9.   Monk -  85
10.   One -  79
весь рейтинг
ГОРЯЧИЕ ТЕМЫ
1-й этап главного конкурса
Анонс 2-ого этапа главного кон
Вычисление рейтинга (обсуждени
Юрий Чайков и Юрий Пачковский
Приглашаем на работу разработч
все форумы
Главная   |  Конкурсы  | Новости  | Статьи  | Сообщество  | Форумы  | ВУЗы  | О проекте
Проект Test The Best (c) 2004-2005
Генеральный спонсор: EPAM systems
Спонсор доступа в интернет компания Solo
Перепечатка оригинальных материалов Test The Best приветствуется при наличии ссылки
Rambler's Top100 Rating All.BY Каталог TUT.BY