Java. Полное руководство. 8-е издание. С. Н. Тригуб Перевод с английского и редакция
Скачать 25.04 Mb.
|
abstract void setRawOffset(int миллисекунд) abstract boolean Возвращает специфичную для класса TimeZone версию метода clone (Возвращает массив строк, представляющих имена всех часовых поясов Возвращает массив строк, представляющих имена всех часовых поясов, отстоящих на смещение смещениеОтГринвича относительно GMT Возвращает объект класса TimeZone, который представляет часовой пояс по умолчанию, принятый на данном компьютере Возвращает имя вызывающего объекта класса TimeZone Возвращает смещение, которое должно быть добавлено к GMT, чтобы вычислить локальное время. Это значение корректируется с учетом летнего времени. Параметры метода представляют компоненты даты и времени Возвращает смещение (в миллисекундах, которое должно быть добавлено к GMT, чтобы вычислить локальное время. Значение не корректируется с учетом летнего времени Возвращает объект класса TimeZone почасовому поясу, имеющему название назвЧП Возвращает значение true, если дата, представленная в d, относится к летнему времени в вызывающем объекте. В противном случае возвращает значение false Устанавливает часовой пояс по умолчанию для данного хоста. ЧП— ссылка на объект класса TimeZone, который нужно использовать Устанавливает имя часового пояса (те. его идентификатор) в соответствии с назвЧП Устанавливает смещение относительно GMT в миллисе кундах Возвращает значение true, если вызывающий объект использует летнее время. В противном случае возвращает значение Класс Класс Sim p le T im e Z one — это удобный подкласс класса T im eZ o ne. Он реализует абстрактные методы класса T im eZ o n e и позволяет работать с часовыми поясами в Григорианском календаре. Этот класс также учитывает летнее время Глава 18. Пакет java.util: прочие служебные классы 5 5 Класс SimpleTimeZone определяет четыре конструктора. Первый представлен ниже смещениеОтГринвича, String назвЧП Этот конструктор создает объект класса SimpleTimeZone. Здесь смеще ниеОтГринвича — это смещение относительно Гринвича, а назвЧП— название часового пояса. Рассмотрим второй конструктор смещениеОтГринвича, String идентификаторЧП, int лвМесяцО, int лвДнейВМесяцеО, int лвДеньО, int времяО, int лвМесяц1, int лвДнейВМесяце!, int лвДень!, int время1) Здесь смещение относительно GMT задается в смещениеОтГринвича. Имя часового пояса передается в идентификаторЧП. Начало действия летнего времени определяется параметрами лвМесяцО, лвДнейВМесяце0, лвДеньО и времяО. Окончание действия летнего времени задается параметрами лвМесяц1, лвДнейВМесяце 1, лвДень! и время1. Рассмотрим третий конструктор класса SimpleTimeZone. SimpleTimeZone(int смещениеОтГринвича, String идентификаторЧП, int лвМесяцО, int лвДнейВМесяцеО, int лвДеньО, int времяО, int лвМесяц!, int лвДнейВМесяце1 , int лвДень1, int время лвСмещение) Здесь лвСмещение — количество миллисекунд, сохраненных переходом налет нее время. И наконец, четвертый конструктор класса SimpleTimeZone. SimpleTimeZone(int смещениеОтГринвича, String идентификаторЧП, int лвМесяцО, int лвДнейВМесяцеО, int лвДеньО, int времяО, int времяОрежим, int лвМесяц1, int лвДнейВМесяце1 , int лвДень1, int время int время1режим, int лвСмещение) Здесь времяОрежимуказывает режим начального времени, а время1режим — режим конечного времени. Ниже перечислены допустимые значения этих режимов ТANDARD_TIME WALL_TIME UTC_TIME Режим времени определяет, как интерпретируются значения времени. Значение режима по умолчанию, используемое другими конструкторами, — WALL_TIME. Класс Класс Locale предназначен для создания объектов, каждый из которых описывает географический или культурный регион. Это один из нескольких классов, обеспечивающих возможность создания многонациональных программ. Например, форматы, применяемые для отображения дат, времени чисел, в разных регионах отличаются. Интернационализация — это тема, выходящая за пределы контекста настоящей книги. Однако большинство программ нуждается только в том, чтобы иметь дело с ее основами, что включает установки только текущих региональных данных. Класс Locale определяет следующие константы, которые удобны для обращения с наиболее часто используемыми региональными данными CANADA GERMAN KOREAN |CANADA_FRENCH GERMANY PRC i CHINA ITALIAN SIMPLIFIED_CHINESE 5 5 6 Часть II. Библиотека Например, выражение Locale. CANADA представляет объект класса Locale для Канады. Вот как выглядят конструкторы класса Locale. Locale(String язык язык String страна язык String страна String вариант) Эти конструкторы создают объект класса Locale для представления специфического языка, а в случае последних двух конструкторов — также и страны. Эти значения должны содержать стандартные коды стран и языков. В параметре вариант может быть предоставлена различная вспомогательная информация. Класс Locale определяет несколько методов. Один из наиболее важных — метод setDef ault () — показан ниже void setDefault(Locale объектРегиона) Это устанавливает используемые по умолчанию региональные данные, применяемые JVM, в параметре объект Региона Вот еще несколько других интересных методов String getDisplayCountry() final String getDisplayLanguage() final String Они возвращают читабельные для человека строки, которые могут быть использованы для отображения наименования страны, наименования языка и полного описания региональных данных. Региональные данные по умолчанию можно получить методом getDef aul t (), показанным ниже Locale Комплект JDK 7 внес существенные изменения в класс Locale, который поддерживает стандарт Internet Engineering Task Force (IETF) BCP 47, определяющий дескрипторы для идентификации языков, и стандарт Unicode Technical Standard (UTS) 35, определяющий язык разметки региональных данных (LDML). Поддержка стандартов ВСР 47 и UTS 35 требует добавления в класс Locale некоторых средств, включая несколько новых методов и класс Locale. Builder. Кроме всех прочих, есть новый метод get Script () , который получает сценарий региона, и метод toLanguageTag (), который получает строку, содержащую языковой дескриптор региона. Класс Locale . Builder создает экземпляры класса Locale. Это гарантирует, что спецификация региона будет корректно оформлена, как определено стандартом ВСР 47. (Конструкторы класса Locale не обеспечивают такую проверку.) Классы Calendar и GregorianCalendar — это примеры классов, чувствительных к региональным данным. Классы DateFormat и SimpleDateFormat также зависят от региональных данных. Класс Класс Random представляет собой генератор псевдослучайных чисел. Они называются псевдослучайными, поскольку представляют собой просто сложные Глава 18. Пакет java.util: прочие служебные классы 5 5 распределенные последовательности. Класс Random определяет следующие конструкторы n d o m () Ra n d o m (1ong начальноеЗначение ) Первая версия создает генератор чисел, использующий уникальное начальное число. Вторая форма позволяет вам указать это число вручную. Если вы инициируете объект класса Random начальным числом, то этим определяете начальную точку случайной последовательности. Если вы используете одно и тоже начальное число для инициализации разных объектов класса Random, то получите от каждого из них одинаковые случайные последовательности. Если вы хотите получить разные последовательности, инициируйте объекты разными числами. Один из способов сделать это — использовать текущее время в качестве инициирующего значения для объекта класса Random. Такой подход уменьшит вероятность получения повторяющихся последовательностей. О ткрытые методы класса Random перечислены в табл. Таблица 18.6. Методы, определенные в классе R a n d o М е Щ Г - П ’' : : • ' Описание 1 - - - - г Г V ^ - г next Boo lean () Возвращает следующее случайное значение типа boolean void nextBytes (byte Заполняет массив значения случайно созданными значе- значения) ниями double next Double () Возвращает следующее случайное значение типа double float nextFloat () Возвращает следующее случайное значение типа float double nextGaussian () Возвращает следующее значение гауссова случайного числа next Int () Возвращает следующее случайное значение типа int int next Int ( int Возвращает следующее случайное значение типа int в диапазоне от 0 доп) Возвращает следующее случайное значение типа long void setSeed(l ong Устанавливает начальное значение (те. началь на чальноеЗна ч е ни е ) ную точку для генератора случайных чисел) равным на чальноеЗна чение Как видите, есть семь типов случайных чисел, которые вы можете извлечь из объекта класса Random. Булевы случайные значения доступны при помощи метода nextBoolean( ). Случайные байты можно получить с помощью метода nextBytes (). Целые случайные числа можно получать методом next Int (). Случайные целочисленные длинные, равномерно распределенные по диапазону допустимых значений, выдает метод next Long (). Методы nextFloat () и next- Double() возвращают случайные значения типа float и double, равномерно распределенные между 0,0 и 1,0. И наконец, метод nextGaussian () возвращает значение типа double, центрированное по 0,0 со стандартным отклонением в 1,0. Это то, что известно под названием кривая нормального распределения. Ниже приведен пример, демонстрирующий последовательность, создаваемую методом nextGaussian () . Он получает 100 случайных гауссовых значений и усредняет их. Программа также подсчитывает количество значений, попадающих в два стандартных отклонения — плюс или минус, используя инкремент 0,5 для каждой категории. Результат отображается графически на экране Демонстрирует случайные гауссовы значения import java.util.Random; class RandDemo { 5 5 Часть II. Библиотека Java public static void main(String a r g s []) { Random r = new Ra n d o m (); double val; double sum = 0; int bell[] = new i n t [10]; for(int i=0; i<100; i++) { val = r.nextGaussian(); sum + = val; double t = -2; for(int x=0; x<10; x++, t + = 0.5) if(val < t) Среднее всех значений " + (sum/100)); // отобразить кривую распределения for(int i=0; i<10; i++) { for(int x=bell[i]; x>0; Ниже можно видеть пример запуска этой программы. Как видите, получается колоколоподобное распределение чисел. Среднее всех значений 0.0702235271133344 ★ * ******* ****** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ********** * * * * * * * * * * Класс Класс Observable служит для создания подклассов, за которыми могут наблюдать остальные части вашей программы. Когда с объектом такого подкласса происходят изменения, наблюдающие классы извещаются об этом. Наблюдающие классы должны реализовать интерфейс Observer, в котором определен метод update () . Этот метод вызывается, когда наблюдатель получает извещение об изменении наблюдаемого объекта. Класс Observable определяет методы, показанные в табл. 18.7. Объект, который подлежит наблюдению, должен следовать двум простым правилам. Во-первых, если он изменяется, то должен вызывать метод setChanged (). Во-вторых, когда он готов известить наблюдателей об изменении, то должен вызвать метод notifyOb- servers () . Это заставляет наблюдающий объект (или объекты) вызывать метод up date (). Будьте осторожны если объект обращается к методу notifyObservers (), не вызвав предварительно метод setChanged (), то никакого действия не последует Глава 18. Пакет java.util: прочие служебные классы 5 Наблюдаемый объект должен вызывать и метод s e tC h a n g e d (), и метод n o t ifyOb- s e r v e r s (), прежде чем будет вызван метод u p d a te (Таблица 18.7. Методы, определенные в классе O b s e r v a b l e Метод Описание void Добавляет объект к списку объектов, наблюдающих за объект) вызывающим объектом Вызов этого метода помечает вызывающий объект как l e a r C h a n g e d (не изменявшийся c o u n t O b s e r v e r s (Возвращает количество объектов, наблюдающих за текущим объектом void Удаляет объект из списка объектов, наблюдающих за объект) вызывающим объектом d e l e t e O b s e r v e r s (Удаляет все наблюдатели вызывающего объекта h a s C h a n g e d Возвращает значение true, если вызывающий объект модифицировался, и значение false — в противном случае n o t i f y O b s e r v e r s (Извещает наблюдателей о том, что вызывающий объект был изменен методом update () . Вторым параметром метода update () передается значение Извещает наблюдателей о том, что вызывающий объект notifyObservers(Object изменялся вызовом метода update ( ). Вторым параме объект) тром метода update ( ) передается объект void s e t C h a n g e d (Вызывается при изменении вызывающего объекта Отметим, что метод n o t i f y O b s e r v e r s () имеет две формы с аргументом и без. Если вызвать метод n o t i f y O b s e r v e r s () с аргументом, этот объект передается методу u p d a te () наблюдателя в качестве второго параметра. В противном случае методу u p d a te () передается значение n u l l . Вы можете использовать второй параметр для передачи объекта любого типа, подходящего вашему приложению. Интерфейс O b s e r v e Чтобы организовать наблюдение за объектом, следует реализовать интерфейс Observer. Этот интерфейс определяет только один метод update(Observable наблюдаемыйОбъект, Object арг) Здесь наблюдаемыйОбъект — это объект, подлежащий наблюдению, а арг — значение, переданное методу notifyObservers (). Метод update () вызывается при изменении наблюдаемого объекта. Пример использования интерфейса o b s e r v e Ниже приведен пример, демонстрирующий работу с наблюдаемым объектом. Здесь создается класс наблюдателя по имени Watcher, который реализует интерфейс Observer. Класс, подлежащий мониторингу, называется BeingWatched. Он расширяет класс Observable. Внутри класса BeingWatched имеется метод coun ter () , который просто выполняет обратный отсчет от указанного значения. Он использует метод sleep () для ожидания 10 секунд между отсчетами. Каждый раз 5 6 0 Часть II. Библиотека когда счетчик изменяется, вызывается метод notifyObservers () , которому передается в качестве аргумента текущее значение счетчика. Это заставляет вызывать метод update () внутри класса Watcher, который отображает текущее значение счетчика. Внутри метода main () создаются наблюдающий и наблюдаемый объекты классов Watcher и BeingWatched под именами, соответственно, observing и ob served. Затем объект observing добавляется к списку наблюдателей для объекта observed. Это означает, что метод observing.update () будет вызываться каждый раз, когда метод counter () вызывает метод noti fyObservers ( ) /* Демонстрация применения класса Observable и интерфейса Observer. */ import java.util.*; // Класс-наблюдатель. class Watcher implements Observer { public void update(Observable obj, Object arg) { System.out.println("update() вызван, count равен " + ((Integer)arg).intValue()); } } // Это — наблюдаемый класс class BeingWatched extends Observable { void counter(int period) { for( ; period >=0; period--) { setChanged(); notifyObservers(new Integer(period)); try { Thread.sleep(100); } c a t c h (InterruptedException e) Ожидание прервано ObserverDemo { public static void main(String a r g s []) { BeingWatched observed = new BeingWatched(); Watcher observing = new Watcher(); /* Добавить наблюдателя в список наблюдателей наблюдаемого объекта Вывод этой программы показан ниже d a t e () вызван, count равен d a t e () вызван равен 9 u p d a t e () вызван равен d a t e () вызван равен d a t e () вызван равен d a t e () вызван равен d a t e () вызван равен 4 up d a t e () вызван равен 3 u p d a t e () вызван равен 2 up d a t e () вызван равен d a t e () вызван равен 0 Глава 18. Пакет java.util: прочие служебные классы 6 Наблюдателями могут быть несколько объектов. Например, в следующей программе реализуются два класса наблюдателя, и объекты каждого класса добавляются к списку наблюдателей класса BeingWatched. Второй наблюдатель ожидает, пока счетчик достигнет нулевого значения, после чего подает звуковой сигнал Объект может наблюдаться одним или более наблюдателями java.util.*; |