Главная страница
Навигация по странице:

  • ВНИМАНИЕ!

  • НА ЗАМЕТКУ.

  • Кей С. Хорстманн


    Скачать 1.62 Mb.
    НазваниеКей С. Хорстманн
    Дата07.04.2023
    Размер1.62 Mb.
    Формат файлаpdf
    Имя файлаjavase9bazovyykurs.pdf
    ТипДокументы
    #1044418
    страница2 из 4
    1   2   3   4
    16
    14.3.9. Расширение классов и реализация интерфейсов в Java
    522 14.3.10. Исключения
    524 14.4. Написание сценариев командного процессора средствами Nashorn
    524 14.4.1. Выполнение команд из командного процессора
    525 14.4.2. Интерполяция символьных строк
    526 14.4.3. Ввод данных в сценарий
    527
    Упражнения
    528
    15
    МОДУЛЬНАЯ СИСТЕМА НА ПЛАТФОРМЕ JAVA
    531 15.1. Понятие модуля
    533 15.2. Именование модулей
    535 15.3. Пример модульной программы "Hello, World!"
    535 15.4. Требования модулей
    537 15.5. Экспорт пакетов
    540 15.6. Модули и рефлективный доступ
    543 15.7. Модульные архивные JAR-файлы
    546 15.8. Автоматические и безымянные модули
    548 15.9. Параметры командной строки для переноса прикладного кода 550 15.10. Переходные и статические требования
    552 15.11. Уточненный экспорт и открытие модулей
    554 15.12. Загрузка служб
    555 15.13. Инструментальные средства для работы с модулями
    557
    Упражнения
    560
    ПРЕДМЕТНЫЙ УКАЗАТЕЛЬ
    563
    Java_SE_9_for_the_Impatient_2nd_Edit.indb 16 16.04.2018 16:40:07

    Предисловие
    Язык программирования Java существует уже более двадцати лет, и в классическом издании Core Java™ (в русском переводе это десятое издание вышло в двух томах под общим названием Java. Библиотека профессионала в
    ИД “Вильямс”, 2017 г.) во всех подробностях описывается не только сам язык, но и все основные его библиотеки, а также многочисленные изменения в оче- редных версиях. Но если вам требуется лишь перейти на современную вер- сию языка Java и освоить его основные библиотеки, чтобы работать более продуктивно, то это можно сделать более простым и кратким путем. В этой книге не прослеживается история развития и не рассматриваются подробно языковые средства предыдущих версий Java, а раскрываются наилучшие сто- роны современной, девятой версии Java, чтобы их можно было быстро при- менить на практике.
    Как и в предыдущих моих книгах, написанных в стиле изложения “для нетерпеливых”, мне хотелось сразу ввести вас, читатель, в курс дела, не вда- ваясь в подробное рассмотрение преимуществ одних понятий над другими, чтобы показать, что именно вам нужно знать для решения конкретных задач программирования. Поэтому материал в этой книге представлен небольши- ми фрагментами, организованными таким образом, чтобы вы могли быстро извлечь полезные сведения по мере надобности.
    Если у вас имеется опыт программирования на других языках, напри- мер C++, JavaScript, Objective C, PHP или Ruby, эта книга поможет вам гра- мотно программировать и на Java. В ней рассматриваются все особенности
    Java, которые должны быть известны разработчику, включая эффективные лямбда-выражения и потоки данных. В этой книге делаются ссылки на уста- ревшие понятия и языковые конструкции, которые могут встретиться в унас- ледованном коде, но я не буду останавливаться на них подробно.
    Главная причина для использования Java состоит в том, чтобы решать задачи параллельного программирования. Имея в своем распоряжении па- раллельные алгоритмы и потокобезопасные структуры данных, доступные в готовом виде в библиотеке Java, прикладные программисты должны совсем иначе отнестись к параллельному программированию. В этой книге под со- вершенно новым углом зрения будет показано, как пользоваться эффектив- ными библиотечными средствами вместо чреватых ошибками низкоуровне- вых конструкций.
    Java_SE_9_for_the_Impatient_2nd_Edit.indb 18 16.04.2018 16:40:07

    19
    Посвящение
    По традиции в книгах по Java основное внимание уделяется программи- рованию пользовательского интерфейса, но ныне лишь немногие разработ- чики создают пользовательские интерфейсы для настольных систем. Если вы предполагаете пользоваться Java для программирования на стороне сервера или на платформе Android, данная книга поможет вам делать это эффек- тивно, не отвлекаясь на код графического пользовательского интерфейса на- стольных систем.
    И наконец, книга написана для прикладных, но не для системных про- граммистов или тех, кто изучает программирование в учебных заведениях.
    В этой книге рассматриваются вопросы, которые приходится решать при- кладным программистам, включая протоколирование и обработку файлов.
    Но из нее нельзя узнать, как реализовать связный список вручную или напи- сать код для веб-сервера.
    Надеюсь, что вам понравится это беглое введение в современную версию
    Java, а также на то, что оно сделает вашу работу с Java более производитель- ной и приятной. Если вы обнаружите ошибки в книге или имеете дельные предложения по ее усовершенствованию, оставьте комментарии на веб-стра- нице, доступной по адресу http://horstmann.com/javaimpatient. На этой странице вы найдете также ссылку на архивный файл, содержащий весь код из примеров, приведенных в книге.
    Java_SE_9_for_the_Impatient_2nd_Edit.indb 19 16.04.2018 16:40:07

    Благодарности
    Как всегда, выражаю искреннюю благодарность своему редактору Грегу
    Дёнчу (Greg Doench), которому принадлежит замысел издать краткое посо- бие для прикладных программистов, чтобы помочь им поскорее освоить вер- сию Java SE 9. Как и прежде, Дмитрий и Алина Кирсановы превратили ру- копись формата XHTML в привлекательную книгу, сделав это поразительно быстро и в то же время уделив должное внимание деталям. Благодарю также рецензентов книги, обнаруживших в ней немало досадных ошибок и внес- ших ряд дельных предложений по ее улучшению. Среди них хотелось бы от- метить Андреса Алмирая (Andres Almiray), Гейла Андерсона (Gail Anderson),
    Маркуса Биля (Marcus Biel), Брайна Гётца (Brian Goetz), Марти Холла (Marty
    Hall), Марка Лоуренса (Mark Lawrence), Дуга Ли (Doug Lea), Саймона Ритте- ра (Simon Ritter), Йошики Шибата (Yoshiki Shibata) и Кристиана Улленбоома
    (Christian Ullenboom).
    Кей Хорстманн,
    Сан-Франциско, США
    июль 2017 г.
    Java_SE_9_for_the_Impatient_2nd_Edit.indb 20 16.04.2018 16:40:07

    Глава 11
    Аннотации
    В этой главе...
    „
    11.1. Применение аннотаций
    „
    11.2. Определение аннотаций
    „
    11.3. Стандартные аннотации
    „
    11.4. Обработка аннотаций во время выполнения
    „
    11.5. Обработка аннотаций на уровне исходного кода
    „
    Упражнения
    11
    Глава
    Java_SE_9_for_the_Impatient_2nd_Edit.indb 431 16.04.2018 16:40:27

    Глава 11
    „
    Аннотации
    432
    Аннотации являются дескрипторами, вставляемыми в исходный код с целью обработать их какими-нибудь инструментальными средствами. Эти средства могут действовать на уровне исходного кода или обрабатывать фай- лы классов, в которых компилятор разместил аннотации.
    Аннотации не изменяют порядок компиляции программы. Компилятор
    Java генерирует те же самые инструкции для виртуальной машины как при наличии аннотаций, так и в их отсутствие. Чтобы извлечь выгоду из аннота- ций, нужно выбрать подходящее инструментальное средство их обработки и пользоваться теми аннотациями, которые оно понимает, прежде чем приме- нять его в своем коде.
    Аннотации находят широкое применение. Например, в инструменталь- ном средстве модульного тестирования JUnit они применяются для пометки методов, выполняющих тесты, а также для указания порядка их выполнения.
    А в архитектуре Java Persistence Architecture аннотации служат для определе- ния взаимных преобразований классов и таблиц базы данных, чтобы объек- ты могли сохраняться автоматически, не вынуждая разработчиков писать для этой цели запросы SQL.
    В этой главе рассматриваются особенности синтаксиса аннотаций, опреде- ления собственных аннотаций и написания процессоров аннотаций, работа- ющих на уровне исходного кода во время выполнения.
    Основные положения этой главы приведены ниже.
    1. Аннотировать можно объявления аналогично употреблению таких мо- дификаторов доступа, как public или static.
    2. Аннотировать можно также типы данных, появляющиеся в объявлени- ях, приведение и проверки типов instanceof или ссылки на методы.
    3. Аннотации начинаются со знака
    @ и могут содержать пары “ключ–зна- чение”, называемые элементами аннотаций.
    4. Значениями аннотаций должны быть константы времени компиляции, т.е. статические константы: примитивных типов, перечислимого типа, литералы типа Class, другие аннотации или их массивы.
    5. Элемент кода может быть снабжен повторяющимися или разнотипны- ми аннотациями.
    6. Чтобы определить аннотацию, достаточно указать ее интерфейс, мето- ды которого соответствуют элементам аннотации.
    7. В библиотеке Java определяется более десятка аннотаций, которые ши- роко применяются в версии Java Enterprise Edition.
    8. Для обработки аннотаций в выполняющейся программе на Java можно воспользоваться рефлексией, запрашивая получаемые с ее помощью элементы кода для аннотаций.
    Java_SE_9_for_the_Impatient_2nd_Edit.indb 432 16.04.2018 16:40:27

    433
    11.1. Применение аннотаций
    9. Процессоры аннотаций служат для обработки исходных файлов во вре- мя компиляции, используя прикладной программный интерфейс API модели языка для обнаружения аннотированных элементов кода.
    11.1. Применение аннотаций
    Ниже приведен пример простой аннотации.
    public class CacheTest {
    @Test public void checkRandomInsertions()
    }
    В данном примере аннотация @Test служит для аннотирования метода checkRandomInsertions(). В языке Java аннотация применяется аналогично модификатору доступа вроде public или static. Имя каждой аннотации предваряется знаком @.
    Сама аннотация @Test ничего не делает. Для того чтобы она принесла ка- кую-то пользу, требуется специальное инструментальное средство. Напри- мер, в инструментальном средстве тестирования JUnit 4, свободно доступном по адресу http://junit.org, вызовы всех методов помечаются аннотацией
    @Test при тестировании их класса. А другое инструментальное средство мо- жет удалить все тестовые методы из файла класса, чтобы они не поставлялись вместе с программой после ее тестирования.
    11.1.1. Элементы аннотаций
    У аннотаций могут быть пары “ключ–значение”, называемые элементами, как показано ниже.
    @Test(timeout=10000)
    Имена и типы допустимых элементов определяются каждой аннотацией
    (см. далее в разделе 11.2). Элементы аннотаций могут быть обработаны ин- струментальными средствами, читающими аннотации.
    К числу элементов аннотаций относятся следующие.

    Значение примитивного типа.

    Объект типа String.

    Объект типа Class.

    Экземпляр перечислимого типа.

    Собственно аннотация.

    Массив любых из перечисленных выше элементов, но не массив массивов.
    Java_SE_9_for_the_Impatient_2nd_Edit.indb 433 16.04.2018 16:40:27

    Глава 11
    „
    Аннотации
    434
    В качестве примера ниже приведена аннотация, состоящая из разнотип- ных элементов.
    @BugReport(showStopper=true, assignedTo="Harry", testCase=CacheTest.class, status=BugReport.Status.CONFIRMED)
    ВНИМАНИЕ! Элемент аннотации вообще не может иметь пустое значение
    null.
    Элементы аннотаций могут иметь значения, устанавливаемые по умол- чанию. Например, значение по умолчанию элемента timeout аннотации
    @Test равно 0L. Следовательно, аннотация @Test равнозначна аннотации
    @Test(timeout=0L).
    Если элемент аннотации называется value и является указанным в ней единственным элементом, то присваивание value= можно опустить. Напри- мер, аннотация @SuppressWarnings("unchecked") равнозначна аннотации
    @SuppressWarnings(value="unchecked").
    Если в качестве значения аннотации присваивается массив, то его элемен- ты заключаются в фигурные скобки, как показано ниже.
    @BugReport(reportedBy={"Harry", "Fred"})
    Фигурные скобки можно опустить, если массив состоит из единственного элемента, как в следующей строке кода:
    @BugReport(reportedBy="Harry") // То же, что и {"Harry"}
    В качестве элемента одной аннотации может служить другая аннотация, как показано ниже.
    @BugReport(ref=@Reference(id=11235811), ...)
    ВНИМАНИЕ! Аннотации вычисляются компилятором, и поэтому все значения их элемен- тов должны быть константами времени компиляции, т.е. статическими константами.
    11.1.2. Многие и повторяющиеся аннотации
    Элемент кода может быть помечен несколькими аннотациями, как пока- зано ниже.
    @Test
    @BugReport(showStopper=true, reportedBy="Joe") public void checkRandomInsertions()
    Java_SE_9_for_the_Impatient_2nd_Edit.indb 434 16.04.2018 16:40:27

    435
    11.1. Применение аннотаций
    Если автор аннотации объявил ее как повторяющуюся, то одну и ту же аннотацию можно повторить неоднократно следующим образом:
    @BugReport(showStopper=true, reportedBy="Joe")
    @BugReport(reportedBy={"Harry", "Carl"}) public void checkRandomInsertions()
    11.1.3. Объявление аннотаций
    До сих пор были представлены примеры аннотаций, применявшихся в объявлениях методов. Аннотации могут встречаться и во многих других ме- стах прикладного кода, которые можно разделить на две категории: объявле-
    ния и места употребления типов. Аннотации могут появляться в объявлениях следующих элементов кода.

    Классы (включая и перечисления) и интерфейсы (в том числе и интер- фейсы аннотаций).

    Методы.

    Конструкторы.

    Переменные экземпляра (включая и константы перечислимого типа).

    Локальные переменные (в том числе и те, что объявлены в цикле for и операторах try с ресурсами).

    Переменные параметров и параметры оператора catch.

    Параметры типа.

    Пакеты.
    В объявлениях классов и интерфейсов аннотации указываются перед клю- чевым словом class или interface следующим образом:
    @Entity public class User { ... }
    А в объявлениях переменных аннотации указываются перед типом пере- менной таким образом:
    @SuppressWarnings("unchecked") List users = ...; public User getUser(@Param("id") String userId)
    Параметр типа в обобщенном классе или методе может быть аннотирован следующим образом:
    public class Cache<@Immutable V> { ... }
    Пакет аннотируется в отдельном файле package-info.java. Этот файл со- держит только операторы объявления и импорта пакета с предшествующими
    Java_SE_9_for_the_Impatient_2nd_Edit.indb 435 16.04.2018 16:40:27

    Глава 11
    „
    Аннотации
    436
    аннотациями, как показано ниже. Обратите внимание на то, что оператор import следует после оператора package, в котором объявляется пакет.
    /**
    Документирующий комментарий на уровне пакета
    */
    @GPL(version="3") package com.horstmann.corejava; import org.gnu.GPL;
    НА ЗАМЕТКУ. Аннотации локальных переменных и пакетов отбрасываются при компили- ровании класса. Следовательно, они могут быть обработаны только на уровне исходного кода.
    11.1.4. Аннотации в местах употребления типов
    Аннотация в объявлении предоставляет некоторые сведения об объявляе- мом элементе кода. Так, в следующем примере кода аннотацией утверждает- ся, что параметр userId объявляемого метода не является пустым:
    public User getUser(@NonNull String userId)
    НА ЗАМЕТКУ. Аннотация
    @NonNull является частью каркаса Checker Framework
    (
    http://types.cs.washington.edu/checker-framework). С помощью этого кар- каса можно включать утверждения в прикладную программу, например, утверждение, что параметр не является пустым или относится к типу
    String и содержит регулярное выражение. В таком случае инструментальное средство статистического анализа прове- рит достоверность утверждений в данном теле исходного кода.
    А теперь допустим, что имеется параметр типа List и требуется каким-то образом указать, что все символьные строки не являются пустыми.
    Именно здесь и пригодятся аннотации в местах употребления типов. Такую аннотацию достаточно указать перед аргументом типа следующим образом:
    List<@NonNull String>
    Подобные аннотации можно указывать в следующих местах употребления типов.

    Вместе с аргументами обобщенного типа: List<@NonNull String>,
    Comparator.<@NonNull String> reverseOrder().

    В любом месте массива: @NonNull String[][] words (элемент массива words[i][j] не является пустым), String @NonNull [][] words (массив words не является пустым), String[] @NonNull [] words (элемент масси- ва words[i] не является пустым).
    Java_SE_9_for_the_Impatient_2nd_Edit.indb 436 16.04.2018 16:40:27

    437
    11.1. Применение аннотаций

    В суперклассах и реализуемых интерфейсах: class Warning extends
    @Localized Message.

    В вызовах конструкторов: new @Localized String(...).

    Во вложенных типах: Map.@Localized Entry.

    В приведении и проверках типов instanceof: (@Localized String) text, if (text instanceof @Localized String). (Аннотации служат для употребления только внешними инструментальными средствами. Они не оказывают никакого влияния на поведение приведения и проверки типов instanceof.)

    В местах указания исключений: public String read() throws @Localized
    IOException.

    Вместе с метасимволами подстановки и ограничениями типов: List
    <@Localized ? extends Message>, List.

    В ссылках на методы и конструкторы: @Localized Message::getText.
    Имеются все же некоторые места употребления типов, где аннотации не допускаются. Ниже приведены характерные тому примеры.
    @NonNull String.class // ОШИБКА: литерал класса не
    // подлежит аннотированию! import java.lang.@NonNull String; // ОШИБКА: импорт не
    // подлежит аннотированию!
    Аннотации можно размещать до или после других модификаторов досту- па вроде private и static. Обычно (хотя и не обязательно) аннотации в ме- стах употребления типов размещаются после других модификаторов досту- па, тогда как аннотации в объявлениях — перед другими модификаторами доступа. Ниже приведены характерные тому примеры.
    private @NonNull String text;
    // Аннотация в месте употребления типа
    @Id private String userId;
    // Аннотация в объявлении переменной
    НА ЗАМЕТКУ. Как поясняется в разделе 11.2, автор аннотации должен указать место, в котором может появиться конкретная аннотация. Если аннотация допускается как в объявлении переменной, так и в месте употребления типа, а также применяется в объяв- лении переменной, то она указывается и в том и в другом месте. Рассмотрим в качестве примера следующее объявление метода:
    1   2   3   4


    написать администратору сайта