init java что это

Русские Блоги

Глубокое понимание порядка выполнения Java Clinit и init

Предисловие:

Недавно я углубленно изучил знания в книге JVM, и у меня есть более глубокое понимание порядка выполнения различных частей в Java. Сначала мы должны понять разницу между init и clinit в Java.

концепция:
java.lang.Class.forName (имя строки, логическая инициализация, загрузчик ClassLoader), где вторым параметром является необходимость его инициализации.

Разница между init и clinit:

TimingВременные интервалы между методами инициации и клиники разные

Методы init и clinit имеют разные цели исполнения

Детальный клиник

На этапе подготовки переменной было присвоено начальное значение, требуемое системой, а на этапе инициализации переменные класса и другие ресурсы инициализируются в соответствии с субъективным планом, составленным программистом через программу, или это можно выразить с другой точки зрения: этап инициализации Процесс выполнения метода конструктора класса ().

①<clinit>() Метод генерируется компилятором, который автоматически собирает действия по присваиванию всех переменных класса в классе и операторов в блоке статических операторов (блок static <>). Порядок, в котором собирает компилятор, определяется порядком, в котором операторы появляются в исходном файле. Да, в блоке статических операторов доступны только переменные, определенные до блока статических операторов, переменные, определенные после него, могут быть назначены в предыдущем блоке статических операторов, но следующий код недоступен

Примечание. Все атрибуты в интерфейсе являются статическими константами окончательного типа, поэтому они были инициализированы на этапе подготовки.

Источник

Init java что это

Разработка Java началась в 1990 году, первая официальная версия Java 1.0 была
выпущена только в 1996 году.

К 1998 году была разработана обновлённая спецификация JDK 1.2, вышедшая под наименованием
Java 2. Язык практически не изменился — было добавлено одно ключевое слово strictfp.

Java 5.0
Спецификация Java 5.0 была выпущена в сентябре 2004 года. C этой версии изменена
официальная индексация, вместо Java 1.5 правильнее называть Java 5.0.
Внутренняя же индексация Sun осталась прежней — 1.x.

Апплеты
Java-апплет — прикладная программа, чаще всего написанная на языке программирования
Java в форме байт-кода. Java-апплеты выполняются в веб-браузере с использованием
виртуальной Java машины (JVM), или в Sun’s AppletViewer, автономном инструменте для
тестирования апплетов. Java-апплеты были внедрены в первой версии языка Java в 1995 году.
Java-апплеты обычно пишутся на языке программирования Java, но могут быть написаны и на
других языках, которые компилируются в байт-код Java, таких, как Jython.

Сервлеты
Сервлет является Java-интерфейсом, реализация которого расширяет функциональные
возможности сервера. Сервлет взаимодействует с клиентами посредством принципа запрос-ответ.
Хотя сервлеты могут обслуживать любые запросы, они обычно используются для расширения
веб-серверов. Для таких приложений технология Java Servlet определяет HTTP-специфичные
сервлет классы. Пакеты javax.servlet и javax.servlet.http обеспечивают интерфейсы и
классы для создания сервлетов.

ОСНОВНЫЕ ОСОБЕННОСТИ ЯЗЫКА


ПРИМЕР создания байт-кода и запуска из командной строки выполнения программы

Java package (пакет Java) — механизм, позволяющий организовать Java классы в
пространства имен аналогично модулям в языке программирования Модула.
Java пакеты могут содержаться в сжатом виде в JAR файлах. Обычно в пакеты
объединяют классы одной и той же категории, либо предоставляющие сходную
функциональность.
Каждый пакет предоставляет уникальное пространство имен для своего содержимого.
Допустимы вложенные пакеты.
Классы, определенные без явно заданных модификаторов доступа (public, protected,
private), видимы только внутри пакета.
Каждый Java-объект существует в пакете.Если вы не укажете явно, к какому из них он
принадлежит, Java поместит его в пакет по умолчанию.

Модификатор static показывает, что метод статический. То есть, он работает даже тогда,
когда экземпляр класса (объект) не создан. 1. Если исходный текс в файле C:\javaPrim\HelloWorld.java,то выполнить команду
C:\>cd javaPrim

2.Создание байт-кода
В командном окне выполнить следующие команды 3. Выполнить

ПРИМЕР создания и выполнения апплета


Методы init, start, stop и destroy класса Applet

Метод init
Метод init определен в базовом классе Applet, от которого наследуются все аплеты.
Определение его таково, что этот метод ровным счетом ничего не делает.

Метод destroy
Перед удалением аплета из памяти вызывается метод destroy, который определен в
базовом классе Applet как пустая заглушка. Мастер проектов добавляет в исходный
текст класса переопределение метода destroy, которое вы можете при необходимости
изменить.
Методу destroy обычно поручают все необходимые операции, которые следует
выполнить перед удалением аплета. Например, если в методе init вы создавали
какие-либо потоки, в методе destroy их нужно завершить.

Метод start.
Метод start вызывается после метода init в момент, когда пользователь начинает
просматривать документ HTML с встроенным в него аплетом.
Вы можете модифицировать текст этого метода, если при каждом посещении пользователем
страницы с аплетом необходимо выполнять какую-либо инициализацию.

Метод stop
Дополнением к методу start служит метод stop. Он получает управление,
когда пользователь покидает страницу с аплетом и загружает в окно браузера
другую страницу. Заметим, что метод stop вызывается перед методом destroy.

К Л А С С Ы


КОНСТРУКТОРЫ

Пример. Создаётся класс krug с шестью полями (свойствами)и два экземпляра круга
Приводятся два варианта:
— без использования явно заданного конструктора;
— с конструктором.
Вариант без конструктора закомментирован. Результат:

Модификатор static

Модификатор static нужен для данных, которые должны
существовать в единственном экземпляре на весь класс,
Метод, не имеющий модификатора static, называется методом
экземпляра. Метод экземпляра может быть вызван только для созданного
экземпляра класса или подкласса. Такой метод нельзя вызывать
непосредственно, квалифицируя его именем класса.
Метод, объявленный с модификатором static, называется статическим методом
(или методом класса) и может быть вызван без создания экземпляра класса.
Этот метод всегда вызывается непосредственно из класса. Статический метод
имеет доступ к другим статическим переменным и методам данного класса.
Если статический метод определен как final-метод, то он не может быть переопределен.

Источник

Java — Основы апплета

Апплет — это Java-программа, которая запускается в веб-браузере. Апплет может быть полнофункциональным Java-приложением, поскольку в его распоряжении находится весь Java API.

Между апплетом и автономным Java-приложением есть несколько важных отличий, включая следующие:

Апплет — это класс Java, который расширяет класс java.applet.Applet.

Метод main () не вызывается в апплете, и класс апплета не будет определять main ().

Апплеты предназначены для встраивания в HTML-страницу.

Когда пользователь просматривает HTML-страницу, которая содержит апплет, код для апплета загружается на компьютер пользователя.

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

JVM на компьютере пользователя создает экземпляр класса апплета и вызывает различные методы в течение жизни апплета.

Апплеты имеют строгие правила безопасности, которые применяются веб-браузером. Безопасность апплета часто упоминается как безопасность песочницы, сравнивая апплет с ребенком, играющим в песочнице с различными правилами, которые необходимо соблюдать.

Другие классы, в которых нуждается апплет, могут быть загружены в один файл Java Archive (JAR).

Апплет — это класс Java, который расширяет класс java.applet.Applet.

Читайте также:  failed to getoption request to app info kurtzpel что делать

Метод main () не вызывается в апплете, и класс апплета не будет определять main ().

Апплеты предназначены для встраивания в HTML-страницу.

Когда пользователь просматривает HTML-страницу, которая содержит апплет, код для апплета загружается на компьютер пользователя.

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

JVM на компьютере пользователя создает экземпляр класса апплета и вызывает различные методы в течение жизни апплета.

Апплеты имеют строгие правила безопасности, которые применяются веб-браузером. Безопасность апплета часто упоминается как безопасность песочницы, сравнивая апплет с ребенком, играющим в песочнице с различными правилами, которые необходимо соблюдать.

Другие классы, в которых нуждается апплет, могут быть загружены в один файл Java Archive (JAR).

Жизненный цикл апплета

Четыре метода в классе Applet дают вам основу для построения любого серьезного апплета —

init — Этот метод предназначен для любой инициализации, необходимой для вашего апплета. Он вызывается после обработки тегов param внутри тега applet.

start — этот метод вызывается автоматически после того, как браузер вызывает метод init. Он также вызывается всякий раз, когда пользователь возвращается на страницу, содержащую апплет, после перехода на другие страницы.

stop — этот метод вызывается автоматически, когда пользователь покидает страницу, на которой находится апплет. Поэтому его можно вызывать повторно в одном и том же апплете.

уничтожить — этот метод вызывается только тогда, когда браузер выключается нормально. Поскольку апплеты предназначены для жизни на HTML-странице, обычно не следует оставлять ресурсы после того, как пользователь покидает страницу, содержащую апплет.

paint — вызывается сразу после метода start (), а также в любое время, когда апплет должен перерисовать себя в браузере. Метод paint () фактически унаследован от java.awt.

init — Этот метод предназначен для любой инициализации, необходимой для вашего апплета. Он вызывается после обработки тегов param внутри тега applet.

start — этот метод вызывается автоматически после того, как браузер вызывает метод init. Он также вызывается всякий раз, когда пользователь возвращается на страницу, содержащую апплет, после перехода на другие страницы.

stop — этот метод вызывается автоматически, когда пользователь покидает страницу, на которой находится апплет. Поэтому его можно вызывать повторно в одном и том же апплете.

уничтожить — этот метод вызывается только тогда, когда браузер выключается нормально. Поскольку апплеты предназначены для жизни на HTML-странице, обычно не следует оставлять ресурсы после того, как пользователь покидает страницу, содержащую апплет.

paint — вызывается сразу после метода start (), а также в любое время, когда апплет должен перерисовать себя в браузере. Метод paint () фактически унаследован от java.awt.

Апплет «Привет, мир»

Ниже приведен простой апплет с именем HelloWorldApplet.java —

Эти операторы импорта переносят классы в область действия нашего класса апплета —

Без этих операторов импорта компилятор Java не распознал бы классы Applet и Graphics, на которые ссылается класс applet.

Апплет Класс

К ним относятся методы, которые делают следующее —

Кроме того, класс Applet предоставляет интерфейс, с помощью которого средство просмотра или браузер получает информацию об апплете и контролирует выполнение апплета. Зритель может —

Класс Applet предоставляет реализации по умолчанию для каждого из этих методов. Эти реализации могут быть переопределены при необходимости.

Апплет «Hello, World» завершен. Единственный переопределенный метод — метод рисования.

Вызов апплета

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

Примечание. Вы можете обратиться к тегу апплета HTML, чтобы узнать больше о вызове апплета из HTML.

Если апплет принимает параметры, значения можно передать для параметров, добавив теги

Если апплет находится в пакете, отличном от пакета по умолчанию, в атрибуте кода необходимо указать удерживающий пакет, используя символ точки (.) Для разделения компонентов пакета / класса. Например —

Получение параметров апплета

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

Второй цвет и размер каждого квадрата могут быть указаны как параметры для апплета в документе.

CheckerApplet получает свои параметры в методе init (). Он также может получить свои параметры в методе paint (). Однако получить значения и сохранить настройки один раз в начале апплета, а не при каждом обновлении, удобно и эффективно.

Программа просмотра или браузер апплета вызывает метод init () каждого запускаемого им апплета. Зритель вызывает init () один раз, сразу после загрузки апплета. (Applet.init () реализован, чтобы ничего не делать.) Переопределите реализацию по умолчанию, чтобы вставить пользовательский код инициализации.

Метод Applet.getParameter () извлекает параметр по имени параметра (значение параметра всегда является строкой). Если значение является числовым или другими не символьными данными, строка должна быть проанализирована.

Ниже приведен скелет CheckerApplet.java —

Вот методы CheckerApplet init () и private parseSquareSize () —

Апплет вызывает parseSquareSize () для анализа параметра squareSize. parseSquareSize () вызывает метод библиотеки Integer.parseInt (), который анализирует строку и возвращает целое число. Integer.parseInt () генерирует исключение всякий раз, когда его аргумент недопустим.

Поэтому parseSquareSize () перехватывает исключения, а не позволяет сбою апплета при неправильном вводе.

Апплет вызывает parseColor () для разбора параметра цвета в значение Color. parseColor () выполняет серию сравнений строк, чтобы сопоставить значение параметра с именем предопределенного цвета. Вам нужно реализовать эти методы, чтобы этот апплет работал.

Указание параметров апплета

Ниже приведен пример файла HTML со встроенным CheckerApplet. HTML-файл определяет оба параметра для апплета с помощью тега

Примечание. Имена параметров не чувствительны к регистру.

Преобразование приложения в апплеты

Легко преобразовать графическое Java-приложение (то есть приложение, которое использует AWT и которое можно запустить с помощью средства запуска Java-программ) в апплет, который можно встроить в веб-страницу.

Ниже приведены конкретные шаги для преобразования приложения в апплет.

Создайте HTML-страницу с соответствующим тегом для загрузки кода апплета.

Поставьте подкласс класса JApplet. Сделайте этот класс публичным. В противном случае апплет не может быть загружен.

Исключите основной метод в приложении. Не создавайте рамочное окно для приложения. Ваше приложение будет отображаться внутри браузера.

Переместите любой код инициализации из конструктора окна фрейма в метод init апплета. Вам не нужно явно создавать объект апплета. Браузер создает его для вас и вызывает метод init.

Удалить вызов setSize; для апплетов изменение размера производится с помощью параметров ширины и высоты в файле HTML.

Удалить вызов setDefaultCloseOperation. Апплет не может быть закрыт; он завершается при выходе из браузера.

Если приложение вызывает setTitle, исключите вызов метода. Апплеты не могут иметь строки заголовка. (Конечно, вы можете озаглавить саму веб-страницу, используя тег заголовка HTML.)

Не вызывайте setVisible (true). Апплет отображается автоматически.

Создайте HTML-страницу с соответствующим тегом для загрузки кода апплета.

Читайте также:  разболтовка на приоре какая 14 радиус

Поставьте подкласс класса JApplet. Сделайте этот класс публичным. В противном случае апплет не может быть загружен.

Исключите основной метод в приложении. Не создавайте рамочное окно для приложения. Ваше приложение будет отображаться внутри браузера.

Переместите любой код инициализации из конструктора окна фрейма в метод init апплета. Вам не нужно явно создавать объект апплета. Браузер создает его для вас и вызывает метод init.

Удалить вызов setSize; для апплетов изменение размера производится с помощью параметров ширины и высоты в файле HTML.

Удалить вызов setDefaultCloseOperation. Апплет не может быть закрыт; он завершается при выходе из браузера.

Если приложение вызывает setTitle, исключите вызов метода. Апплеты не могут иметь строки заголовка. (Конечно, вы можете озаглавить саму веб-страницу, используя тег заголовка HTML.)

Не вызывайте setVisible (true). Апплет отображается автоматически.

Обработка событий

Апплеты наследуют группу методов обработки событий из класса Container. Класс Container определяет несколько методов, таких как processKeyEvent и processMouseEvent, для обработки определенных типов событий, а затем один метод catch-all, называемый processEvent.

Чтобы отреагировать на событие, апплет должен переопределить соответствующий специфичный для события метод.

Теперь давайте назовем этот апплет следующим образом —

Первоначально, апплет отобразит «инициализация апплета. Запуск апплета». Затем, как только вы нажмете внутри прямоугольника, будет отображаться «щелчок мышью».

Отображение изображений

Апплет может отображать изображения в формате GIF, JPEG, BMP и других. Чтобы отобразить изображение в апплете, вы используете метод drawImage (), найденный в классе java.awt.Graphics.

Ниже приведен пример, иллюстрирующий все шаги, чтобы показать изображения —

Теперь давайте назовем этот апплет следующим образом —

Воспроизведение аудио

Апплет может воспроизводить аудиофайл, представленный интерфейсом AudioClip в пакете java.applet. Интерфейс AudioClip имеет три метода, в том числе —

public void play () — воспроизводит аудиоклип один раз с начала.

public void loop () — Заставляет непрерывно воспроизводить аудиоклип.

public void stop () — останавливает воспроизведение аудиоклипа.

public void play () — воспроизводит аудиоклип один раз с начала.

public void loop () — Заставляет непрерывно воспроизводить аудиоклип.

public void stop () — останавливает воспроизведение аудиоклипа.

Чтобы получить объект AudioClip, вы должны вызвать метод getAudioClip () класса Applet. Метод getAudioClip () немедленно возвращает значение независимо от того, преобразуется ли URL в реальный аудиофайл. Аудиофайл не загружается до тех пор, пока не будет предпринята попытка воспроизвести аудиоклип.

Ниже приведен пример, иллюстрирующий все шаги для воспроизведения аудио —

Теперь давайте назовем этот апплет следующим образом —

Источник

5 скрытых cекретов в Java

Привет, Хабр! Представляю вашему вниманию перевод статьи «5 Hidden Secrets in Java» автора Justin Albano.

Хотите стать джедаем Java? Раскройте древние секреты Java. Мы сосредоточимся на расширении аннотаций, инициализации, на комментариях и интерфейсах enum.

По мере развития языков программирования начинают появляться и скрытые функции, а конструкции, о которых никогда не задумывались основатели, все больше распространяются для всеобщего использования. Некоторые из этих функций становятся общепринятыми в языке, тогда как другие отодвигаются в самые темные уголки языкового сообщества. В этой статье мы рассмотрим пять секретов, которые часто упускаются из виду многими разработчиками Java (справедливости ради, некоторые из них имеют веские на это причины). Мы рассмотрим как варианты их использования, так и причины, которые привели к появлению каждой функции, а также некоторые примеры, демонстрирующие, когда целесообразно использовать эти функции.

Читатель должен понимать, что не все эти функции на самом деле скрыты, просто они часто не используются в повседневном программировании. Некоторые из них могут быть очень полезны в подходящий момент, тогда как использование других – почти всегда плохая идея, и показаны они в этой статье, чтобы заинтересовать читателя (и возможно рассмешить его или ее). Читатель также должен сам принимать решение когда использовать функции, описанные в этой статье: «То, что это можно сделать, не означает, что это нужно делать».

1. Реализация аннотаций

Начиная с Java Development Kit (JDK) 5, аннотации являются неотъемлемой частью многих приложений и сред Java. В подавляющем большинстве случаев аннотации применяются к конструкциям, таким как классы, поля, методы и т.д. Однако их можно использовать и как реализуемые интерфейсы. Например, предположим, у нас есть следующее определение аннотации:

Обычно мы применяем эту аннотацию к методу, как показано ниже:

Затем мы можем обработать эту аннотацию, как это описано в Создание аннотаций в Java. Если бы мы также хотели создать интерфейс, позволяющий создавать тесты как объекты, нам пришлось бы создать новый интерфейс, назвав его чем-то другим, а не Test:

Далее мы можем создать экземпляр объекта TestInstance:

Хотя наша аннотация и интерфейс практически идентичны, с очень заметным дублированием, похоже что нет способа объединить эти две конструкции. К счастью, внешность обманчива, и есть метод для объединения этих двух конструкций: Реализация аннотации:

Обратите внимание, что мы должны реализовать метод annotationType и также возвращать тип аннотации, поскольку это неявная часть интерфейса Annotation. Хотя почти во всех случаях реализация аннотации не являются правильным решением для проектирования (компилятор Java будет показывать предупреждение при реализации интерфейса), это может быть полезно в некоторых случаях, например в annotation-driven framework.

2. Нестатические блоки инициализации.

В Java, как и в большинстве объектно-ориентированных языков программирования, объекты создаются исключительно с использованием конструктора (с некоторыми исключениями, такими как десериализация объектов Java). Даже когда мы создаем статические фабричные методы для создания объектов, мы просто заключаем вызов в конструктор объекта, чтобы создать его экземпляр. Например:

Поэтому, когда мы хотим инициализировать объект, мы объединяем логику инициализации в конструкторе объекта. Например, устанавливаем поле name класса Foo в его параметризованном конструкторе. Хотя может показаться обоснованным предположение, что вся логика инициализации находится в конструкторе или наборе конструкторов для класса, в Java это не так. Вместо этого мы можем использовать нестатические блоки инициализации чтобы выполнить код при создании объекта:

Нестатические блоки инициализации указываются путем добавления логики инициализации в набор фигурных скобок в определение класса. Когда объект создается, сначала вызываются нестатические блоки инициализации, а затем конструкторы объекта. Обратите внимание, что можно указать более одного нестатического блока инициализации, и в этом случае каждый вызывается в том порядке, в котором он указан в определении класса. Помимо нестатических блоков инициализации, мы также можем создавать и статические, которые выполняются когда класс загружается в память. Чтобы создать статический блок инициализации, мы просто добавляем ключевое слово static:

Когда в классе присутствуют все три метода инициализации (конструкторы, нестатические блоки инициализации и статические блоки инициализации), статические всегда выполняются первыми (когда класс загружается в память) в порядке их объявления, затем выполняются нестатические блоки инициализации в порядке, в котором они объявлены, а после них – конструкторы. Когда вводится суперкласс, порядок выполнения немного меняется:

Если мы выполним этот код, то получим следующий вывод:

Читайте также:  link downs mikrotik что это

Обратите внимание на то что статические блоки инициализации были выполнены только один раз, даже если были созданы два объекта Foo. Хотя нестатистические и статические блоки инициализации могут быть полезны, логика инициализации должна быть помещена в конструкторы, а методы (или статические методы) должны использоваться в случаях когда сложная логика требует инициализации состояния объекта.

3. Двойная скобка инициализации

Многие языки программирования включают в себя некоторый синтаксический механизм для быстрого и краткого создания списка или карты (или словаря) без использования подробного шаблонного кода. Например, C ++ включает в себя инициализацию скобок, которая позволяет разработчикам быстро создавать список перечисляемых значений или даже инициализировать целые объекты, если конструктор для объекта поддерживает эту функцию. К сожалению, до JDK 9 такая функция не была реализована (об этом позже). Чтобы просто создать список объектов, мы бы сделали следующее:

Хотя это и выполняет нашу цель по созданию нового списка, инициализированного тремя значениями, это слишком многословно, требуя от разработчика повторения имени переменной списка для каждого добавления. Чтобы сократить этот код, мы можем использовать двойную инициализацию скобок:

Инициализация с двойной скобкой, которая получила свое название от набора двух открытых и закрытых фигурных скобок, на самом деле представляет собой совокупность нескольких синтаксических элементов. Сначала мы создаем анонимный внутренний класс, который расширяет класс ArrayList. Поскольку ArrayList не имеет абстрактных методов, мы можем создать пустое тело для анонимной реализации:

Используя этот код, мы по существу создаем анонимный подкласс, ArrayList – точно такой же, как и оригинальный ArrayList. Одно из основных отличий в том, что наш внутренний класс имеет неявную ссылку на содержащий класс (в форме захваченной this переменной), т.к. мы создаем нестатический внутренний класс. Это позволяет нам написать некоторую интересную, если не запутанную логику. Например, добавление этой переменной к анонимному внутреннему классу, инициализированному двойной скобкой:

Если бы этот внутренний класс был определен как статический, у нас не было бы доступа к Foo.this. Например, следующий код, который создает статический FooArrayList внутренний класс, не имеет доступа к Foo.this ссылке и поэтому он не компилируется:

Возобновляя конструкцию нашей инициализированной двойной скобкой ArrayList, как только был создан нестатический внутренний класс, мы используем нестатические блоки инициализации, как описано выше, чтобы добавить три начальных элемента, при создании экземпляра анонимного внутреннего класса. Когда анонимный внутренний класс создан и когда существует только один объект анонимного внутреннего класса, мы можем сказать что создали нестатический внутренний объект, который добавляет три начальных элемента при его создании. Это будет видно, если мы разделим пару фигурных скобок, где одна фигурная скобка представляет собой определение анонимного внутреннего класса, а другая обозначает начало логики инициализации экземпляра:

Хотя этот трюк может быть полезен, JDK 9 (JEP 269) заменил полезность этого трюка набором статических фабричных методов для List (а также многих других типов коллекций). Например, мы могли бы создать List раньше, используя эти статические фабричные методы, как показано далее:

Эта статическая фабричная техника используется по двум основным причинам: (1) не создается анонимный внутренний класс и (2) для сокращения стандартного кода, необходимого для создания List. Следует помнить что в таком случае полученный результат List является неизменным и не может быть изменен после его создания. Чтобы создать изменяемый List файл с любыми начальными элементами, нам приходится использовать обычный метод или метод с двойной скобкой инициализации.

Обратите внимание что простая инициализация, двойная скобка и статические фабричные методы JDK 9 не просто доступны для List. Они доступны для Set и Map объектов, как показано в следующем фрагменте:

Важно понять как происходит инициализация двойной скобки, прежде чем принимать решение об ее использовании. Это улучшает читабельность кода, однако могут появится некоторые побочные эффекты.

4. Исполняемые комментарии

Комментарии являются неотъемлемой частью почти каждой программы, и основное преимущество комментариев заключается в том, что они не выполняются. Это становится еще более очевидным, когда мы закомментируем строку кода в нашей программе: мы хотим сохранить код в нашем приложении, но не хотим, чтобы он выполнялся. Например, следующая программа в результате выводит «5»:

Многие думают что комментарии никогда не выполняются, но это не совсем верно. Например, что выведет следующий фрагмент кода?

Вы могли предположить что это снова 5, но если мы запустим приведенный выше код, то увидим 8 на выходе. Причиной этой «ошибки» является символ Unicode \u000d; этот символ на самом деле является возвратом каретки Unicode, и исходный код Java используется компилятором как текстовые файлы в формате Unicode. Его добавление в код присваивает значению value = 8 в строке, идущей за комментарием, обеспечивая его выполнение. Это означает, что приведенный выше фрагмент кода фактически равен следующему:

Хотя это кажется ошибкой Java, на самом деле это специально добавленная функция в язык. Первоначальная цель состояла в том, чтобы создать независимый от платформы язык (отсюда создание виртуальной машины Java или JVM), и функциональная совместимость исходного кода является ключевым аспектом этой цели. Позволяя исходному коду Java содержать символы Unicode, мы можем использовать нелатинские символы универсальным способом. Это гарантирует, что код, написанный в одном регионе мира (который может содержать нелатинские символы, например в комментариях), может быть выполнен в любом другом. Для получения дополнительной информации см. Раздел 3.3 Спецификации языка Java или JLS.

Если поместить вышеупомянутый код в файл с именем Ugly.java и запустить его, то будет напечатано Hello world на стандартном выходе. Если мы преобразуем эти символы Юникода в символы Американского Стандартного Кода для Обмена Информацией (ASCII), то получим следующую программу:

Итак, символы Unicode могут быть включены в исходный код Java, однако если они не требуется настоятельно не рекомендуется их использовать (например, включать нелатинские символы в комментарии). Если они все же требуются, убедитесь, что они не включают символы, такие как возврат каретки, которые изменяют ожидаемое поведение исходного кода.

5. Реализация интерфейса Enum

Одним из ограничений enums(списка перечислений) по сравнению с другими классами в Java является то, что перечисления не могут расширять другой класс или сами enums. Например, невозможно выполнить следующее:

Однако мы можем заставить наш enums реализовывать интерфейс и обеспечить реализацию для его абстрактных методов следующим образом:

Теперь мы можем использовать экземпляр Person везде, где требуется Speaker объект. Более того, мы также можем обеспечить реализацию абстрактных методов интерфейса на постоянной основе (так называемые методы, специфичные для констант):

В отличие от некоторых других секретов в этой статье, эту технику следует использовать только там, где это необходимо. Например, если enum константа, такая как JOE или JIM, может использоваться вместо интерфейса, такого как Speaker, то enum определяющее константу, должен реализовывать этот тип интерфейса. Для получения дополнительной информации см. Пункт 38 (стр. 176-9) Effective Java, 3rd Edition.

Источник

Сказочный портал