Главная » Просмотр файлов » К. Арнольд, Д. Гослинг - Язык программирования Java

К. Арнольд, Д. Гослинг - Язык программирования Java (1160779), страница 51

Файл №1160779 К. Арнольд, Д. Гослинг - Язык программирования Java (К. Арнольд, Д. Гослинг - Язык программирования Java) 51 страницаК. Арнольд, Д. Гослинг - Язык программирования Java (1160779) страница 512019-09-19СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 51)

ОбъектObservable производится от подкласса Observable, благодаря чему можно вести список объектов Observer, уведомляемых об изменениях вобъекте Observable. Все объекты- “наблюдатели”, входящие в список, должны реализовывать интерфейс Observer. Когда с наблюдаемымобъектом происходят изменения, заслужи вающие внимания, или случаются некоторые события, которые представляют интерес для Observer,вызывается метод notifyObservers объекта Observable, который обращается к методу update для каждого из объектов Observer. Метод updateинтерфейса Observable выглядит следующим образом:public abstract void update(Observable obj, Object arg)Метод вызывается, когда объект Observable должен сообщить наблюдателям об изменении или некотором событии.

Параметр arg даетвозможность передачи произвольного объекта, содержащего описание изменения или события в объекте Observer.Механизм Observer/Observable проектировался с расчетом на универсальность. Каждый класс Observable сам определяет, когда и при какихобстоятельствах должен вызываться метод update объекта Observer.Класс Observable реализует методы для ведения списка объектов Observer, для установки флага, сообщающего об изменении объекта, а такжедля вызова метода update любого из объектов Observer. Для ведения списка объектов Observer используются следующие методы:public synchronized void addObserver(Observer o)Добавляет аргумент o типа Observer к списку объектов-наблюдателей.public synchronized void deleteObserver(Observer o)Удаляет аргумент o типа Observer из списка объектов-наблюдателей.public synchronized void deleteObservers()Удаляет все объекты Observer из списка наблюдателей.public synchronized int countObservers()Возвращает количество объектов-наблюдателей.Следующие методы извещают объекты Observer о произошедших изменениях:public synchronized void notifyObservers(Object arg)Уведомляет все объекты Observer о том, что с наблюдаемым объектом что-то произошло, после чего сбрасывает флаг изменения объекта.

Длякаждого объекта-наблюдателя, входящего в список, вызывается его метод update, первым параметром которого является объект Observable, авторым — arg.public void notifyObservers()Эквивалентен notifyObservers(null).Приведенный ниже пример показывает, как протокол Observer/Observable может применяться для наблюдения за пользователями,зарегистрированными в системе. Сначала определяется класс Users, расширяющий Observable:import java.util.*;public class Users extends Observable {private Hashtable loggedIn = new Hashtable();public void login(String name, String password)throws BadUserException{// метод возбуждает исключение BadUserExceptionif (!passwordValid(name, password)throw new BadUserException(name);UserState state = new UserState(name);loggedIn.put(name, state);setChanged();notifyObservers(state);}public void logout(UserState state) {loggedIn.remove(state.name());setChanged();notifyObservers(state);}}// ...Объект Users содержит список активных пользователей и для каждого из них заводит объект UserState.

Когда кто-либо из пользователей входит всистему или прекращает работу, то всем объектам Observer передается его объект UserState. Метод notifyObservers рассылает сообщениянаблюдателям лишь в случае изменения состояния наблюдаемого объекта, так что мы должны также вызвать метод setChanged для Users, иначеnotifyObservers ничего не сделает. Кроме метода setChanged, существует еще два метода для работы с флагом изменения состояния:clearChanged помечает объект Observable как неизменявшийся, а hasChanged возвращает логическое значение флага.Ниже показано, как может выглядеть реализация update для объекта Observer, постоянно следящего за составом зарегистрированныхпользователей:import java.util.*;public class Eye implements Observer {Users watching;public Eye(Users users) {watching = users;watching.addObserver(this);}public void update(Observable users, Object whichState){if (users != watching)throw new IllegalArgumentException();}}UserState state = (UserState)whichState;if (watching.loggedIn(state))// вход в системуaddUser(state);// внести в списокelseremoveUser(state);// удалить из спискаКаждый объект Eye наблюдает за конкретным объектом Users.

Когда пользователь входит в систему или прекращает работу, объект Eyeизвещается об этом, поскольку в его конструкторе вызывается метод addObserver для объекта User, в котором объект Eye указывается в качествеобъекта-наблюдателя. При вызове метода update происходит проверка на правильность параметров и изменение выводимой информации взависимости от того, вошел ли данный пользователь в систему или вышел.Проверка того, что происходит с объектом UserState, в данном случае выполняется просто.

Впрочем, ее можно избежать — для этого следуетвместо самого объекта UserState передавать объект-оболочку, который описывает, что и с кем происходит. Такой вариант выглядит нагляднее иоблегчает добавление новых возможностей без нарушения существующего программного кода.Механизм Observer/Observable отчасти напоминает механизм wait/ notify для потоков, описанный на стр.

, однако он отличается большейгибкостью и меньшим количеством ограничений. Механизм потоков гарантирует, что синхронный доступ защитит программу от нежелательныхэффектов многозадачности. Механизм наблюдения позволяет организовать между участниками любую связь, не зависящую от используемыхпотоков. В обоих механизмах предусмотрен поставщик информации (Observable и объект, вызывающий notify) и ее потребитель (Obs e rver иобъект, вызывающий wait), однако они удовлетворяют различные потребности. Используйте wait/ notify, когда механизм должен учитыватьспецифику потоков, и Observer/ Observable для более общих случаев.Упражнение 12.6Создайте реализацию интерфейса Attributed, в которой механизм Observer/Observable используется для уведомления наблюдателей обизменениях, происходящих c объектами.12.10. Класс DateКласс Date предоставляет в распоряжение программиста механизм для вычислений, связанных с датами и временем, а также для вывода ихрезультатов (по умолчанию вывод осуществляется в формате, используемом в Соединенных Штатах).

Вы можете установить дату и определитьее, при необходимости учитывая локальный часовой пояс.Предполагается, что класс Date работает в соответствии со стандартом UTC (Coordinated Universal Time — координированное универсальноевремя), однако это не всегда возможно. Неточности возникают из-за механизмов обращения со временем, используемых в операционнойсистеме. /Почти все современные системы временного исчисления предполагают, что одни сутки состоят из 24*60*60 секунд.

В системе UTCпримерно раз в год к суткам прибавляется дополнительная секунда, называемая "переходной". Большинство компьютерных часов не обладаетнеобходимой точностью, чтобы отражать этот факт, поэтому класс Date также не учитывает его. Некоторые компьютерные стандартыопределены в GMT - это название является общеупотребительным, тогда как UT представляет собой "научное" название того же самогостандарта.

Различие между UTC и UT состоит в том, что стандарт UT основан на атомных часах, а UTC - на астрономических наблюдениях. Напрактике отличие оказывается пренебрежимо малым. Ссылки на дополнительную информацию приведены в разделе "Библиография"./Компоненты дат задаются в единицах, принятых в стандарте UTC, и принадлежат соответствующим диапазонам. Значение, выходящее за пределыдиапазона, интерпретируется правильно — например, 32 января эквивалентно 1 февраля. Диапазоны определяются следующим образом:год год после 1900, со всеми цифрамимесяц 0–11дата день месяца, 1–31час 0–23минуты 0–59секунды 0–61 (с учетом переходной секунды).Класс Date прост в использовании, но содержит много методов:public Date()Создает объект Date, соответствующий текущей дате/времени.public Date(int year, int month, int date, int hrs, int min, •• int sec)Создает объект Date, соответствующий заданной дате/времени.public Date(int year, int month, int date, int hrs, int min)Эквивалентно Date(year, month, date, hrs, min, 0), то есть началу текущей минуты.public Date(int year, int month, int date)Эквивалентно Date(year, month, date, 0, 0, 0), то есть полуночи заданной даты.public Date(String s)Создает дату из строки в соответствии с синтаксисом, принятым в методе parse (см.

ниже).public static long UTC(int year, int month, int date, •• int hrs, int min, int sec)Вычисляет значение в стандарте UTC для указанной даты.public static long parse(String s)Анализирует строку, представляющую время, и возвращает полученное значение. Метод может работать со многими форматами, но важнеевсего, что он воспринимает даты в стандарте IETF: “Sat, 12 Aug 1995 13:30:00 GMT”. Он также понимает сокращения для часовых поясов,используемые в США, но в общем случае должно использоваться смещение для часового пояса: “Sat, 12 Aug 1995 13:30:00 GMT+0430" (4 часа 30минут к западу от Гринвичского меридиана). Если часовой пояс не указан, предпо-лагается локальный часовой пояс.

При указании часовогопояса стандарты GMT и UTC считаются эквивалентными.public Date(long date)Создает объект-дату. Перед созданием объекта Date происходит нормализация полей. Метод воспринимает в качестве параметра значение,возвращаемое методами parse и UTC.public int getYear()Возвращает год, всегда следующий после 1900.public int getMonth()Возвращает значение месяца в диапазоне 0–11 (с января по декабрь соответственно).public int getDate()Возвращает число месяца.public int getDay()Возвращает день недели в диапазоне 0–6 (с воскресенья до субботы соответственно).public int getHours()Возвращает час в диапазоне 0–23 (значение 0 соответствует полуночи).public int getMinutes()Возвращает минуты в диапазоне 0–59.public int getSeconds()Возвращает секунды в диапазоне 0–61.public long getTime()Возвращает время в формате UTC.public int getTimezoneOffset()Возвращает смещение часового пояса в минутах.

Характеристики

Тип файла
PDF-файл
Размер
1,1 Mb
Тип материала
Высшее учебное заведение

Список файлов книги

Свежие статьи
Популярно сейчас
А знаете ли Вы, что из года в год задания практически не меняются? Математика, преподаваемая в учебных заведениях, никак не менялась минимум 30 лет. Найдите нужный учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
6501
Авторов
на СтудИзбе
303
Средний доход
с одного платного файла
Обучение Подробнее