Что такое enum?
enum – тип-перечисление. Бывает много разных формулировок вопроса, все они сводятся к разговору о перечислениях вообще. Технически это финальный класс со статическими финальными полями-экземплярами. enum Foo всегда неявно наследуется от Enum<Foo> – то есть перечислением нельзя расширить другой класс, но всё еще можно реализовать интерфейсы. Из-за generic-параметра разные перечисления не имеют общего предка кроме Object.
Является Comparable (сравнивается позиция по порядку объявления значений) и Serializable (сериализуется только имя константы).
Имеет только заранее заданный набор значений. Значения неявно public static final и это нельзя переопределить. Для инициализации констант действуют все правила статической инициализации.
Копии элементов перечисления не создаются даже при десериализации. Вот почему Effective Java предлагает использовать для сериализуемого синглтона enum.
Экземпляры хранят свойства name и ordinal – имя и порядковый номер константы. Статический метод values вернет список всех констант, valueOf – константу по имени. Спецификация.
Финализация и клонирование перечислений запрещены.
enum – тип-перечисление. Бывает много разных формулировок вопроса, все они сводятся к разговору о перечислениях вообще. Технически это финальный класс со статическими финальными полями-экземплярами. enum Foo всегда неявно наследуется от Enum<Foo> – то есть перечислением нельзя расширить другой класс, но всё еще можно реализовать интерфейсы. Из-за generic-параметра разные перечисления не имеют общего предка кроме Object.
Является Comparable (сравнивается позиция по порядку объявления значений) и Serializable (сериализуется только имя константы).
Имеет только заранее заданный набор значений. Значения неявно public static final и это нельзя переопределить. Для инициализации констант действуют все правила статической инициализации.
Копии элементов перечисления не создаются даже при десериализации. Вот почему Effective Java предлагает использовать для сериализуемого синглтона enum.
Экземпляры хранят свойства name и ordinal – имя и порядковый номер константы. Статический метод values вернет список всех констант, valueOf – константу по имени. Спецификация.
Финализация и клонирование перечислений запрещены.
👍22🔥4❤1
- Осваивай Spring!
Тест на знание языка Java
— Ответь на 21 вопрос и проверь, насколько хорошо nы знаешь язык Java и готовы освоить Spring. Сможешь сдать — пройдёшь на продвинутый онлайн-курс "Разработчик на Spring" Framework со скидкой!
Курс доступен в рассрочку.
🎁 Черная пятница в OTUS! Успей применить промокод BLACK23 и получить скидку 15% на курс!
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ruPlease open Telegram to view this post
VIEW IN TELEGRAM
👍6❤1🔥1
Зачем нужен загрузчик классов?
В Java используется динамическая загрузка классов. Ее выполняют загрузчики – наследники абстрактного класса ClassLoader. Кроме того, они же загружают и файлы-ресурсы.
Загрузка класса (точнее любого ссылочного типа) и всех его предков происходит автоматически перед его инициализацией. При этом используется тот лоадер, который загрузил текущий код. Таким образом, загрузка всех, даже встроенных классов – ленивая.
Вручную класс можно загрузить из конкретного загрузчика, передав аргументом его метода loadClass бинарное имя класса.
В URLClassLoader и стандартных загрузчиках JVM источником класса служит .class-файл. Другие загрузчики в своей реализации используют и другие источники: это может быть сетевой ресурс, или класс может генерироваться в рантайме. К примеру загрузчик из javassist специализируется на создании классов на лету.
В результате загрузки создается экземпляр класса Class. В отличие от обычных объектов, такие экземпляры хранятся не в куче, а в permgen/metaspace. Class может быть выгружен, когда загрузивший его ClassLoader стал мусором.
В Java используется динамическая загрузка классов. Ее выполняют загрузчики – наследники абстрактного класса ClassLoader. Кроме того, они же загружают и файлы-ресурсы.
Загрузка класса (точнее любого ссылочного типа) и всех его предков происходит автоматически перед его инициализацией. При этом используется тот лоадер, который загрузил текущий код. Таким образом, загрузка всех, даже встроенных классов – ленивая.
Вручную класс можно загрузить из конкретного загрузчика, передав аргументом его метода loadClass бинарное имя класса.
В URLClassLoader и стандартных загрузчиках JVM источником класса служит .class-файл. Другие загрузчики в своей реализации используют и другие источники: это может быть сетевой ресурс, или класс может генерироваться в рантайме. К примеру загрузчик из javassist специализируется на создании классов на лету.
В результате загрузки создается экземпляр класса Class. В отличие от обычных объектов, такие экземпляры хранятся не в куче, а в permgen/metaspace. Class может быть выгружен, когда загрузивший его ClassLoader стал мусором.
👍16🔥4❤1
🔧В большинстве случаев Gradle используется в командах для довольно несложных задач и только для Kotlin-проектов, java. Между тем, он является очень мощным инструментом разработки для DevOps.
⚡️30 ноября в 19.00 (мск) приглашаем на открытый урок курса “Kotlin Backend Developer Professional” в OTUS
📌На уроке обсудим:
- как выполнять сборку проектов, содержащих компоненты на C/C++, Rust, Go и др. языках;
- как автоматически генерировать исходники с дальнейшей их компиляцией;
- извлекать файлы из репозиториев для дальнейшей обработки;
- разрабатывать кастомные плагины;
- гибко управлять версиями;
- собирать докер-образы.
👉Регистрация для участия https://otus.pw/m22o/
После урока вы сможете продолжить обучение, поступив в группу курса по специальной цене. Возможны разные способы и рассрочка платежа. Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
⚡️30 ноября в 19.00 (мск) приглашаем на открытый урок курса “Kotlin Backend Developer Professional” в OTUS
📌На уроке обсудим:
- как выполнять сборку проектов, содержащих компоненты на C/C++, Rust, Go и др. языках;
- как автоматически генерировать исходники с дальнейшей их компиляцией;
- извлекать файлы из репозиториев для дальнейшей обработки;
- разрабатывать кастомные плагины;
- гибко управлять версиями;
- собирать докер-образы.
👉Регистрация для участия https://otus.pw/m22o/
После урока вы сможете продолжить обучение, поступив в группу курса по специальной цене. Возможны разные способы и рассрочка платежа. Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
🔥7👍3
Какие существуют стандартные загрузчики классов?
В JVM встроено как минимум три стандартных загрузчика:
🔘 Bootstrap – встроенная в JVM нативная реализация, родитель для всех остальных загрузчиков. Загружает часть стандартных классов java.*;
🔘 Platform – отвечает за загрузку стандартных классов Java-рантайма. До Java 9 назывался Extension и занимался загрузкой расширений. Гарантируется, что ему будут видны (но не факт что загружены непосредственно им) все стандартные классы Java SE и JDK;
🔘 System (Application) – загружает классы из classpath конкретного приложения;
Перед тем как загрузить класс, ClassLoader проверит, не может ли это сделать его родитель. Если класс уже загружен, то загрузка не потребуется.
Иллюстрация смысла этой иерархии – загрузчики web-сервера Apache Tomcat. Прикладной код каждого web-приложения работает на своем отдельном загрузчике изолированно от других приложений. Даже один и тот же класс-singleton у каждого приложения будет собственный. Системные классы и общие библиотеки при том грузятся их родительскими загрузчиками, только один раз для сервера.
В JVM встроено как минимум три стандартных загрузчика:
🔘 Bootstrap – встроенная в JVM нативная реализация, родитель для всех остальных загрузчиков. Загружает часть стандартных классов java.*;
🔘 Platform – отвечает за загрузку стандартных классов Java-рантайма. До Java 9 назывался Extension и занимался загрузкой расширений. Гарантируется, что ему будут видны (но не факт что загружены непосредственно им) все стандартные классы Java SE и JDK;
🔘 System (Application) – загружает классы из classpath конкретного приложения;
Перед тем как загрузить класс, ClassLoader проверит, не может ли это сделать его родитель. Если класс уже загружен, то загрузка не потребуется.
Иллюстрация смысла этой иерархии – загрузчики web-сервера Apache Tomcat. Прикладной код каждого web-приложения работает на своем отдельном загрузчике изолированно от других приложений. Даже один и тот же класс-singleton у каждого приложения будет собственный. Системные классы и общие библиотеки при том грузятся их родительскими загрузчиками, только один раз для сервера.
👍18🔥3❤1
Как разработчику увеличить доход?
Расширять список своих скиллов! Начать можно с бесплатного открытого урока «Шаблон проектирования ""Цепочка обязанностей""» от OTUS.
На вебинаре:
- рассмотрим превращение элементов поведения в объекты;
- проанализируем его на конкретном примере, формируя диаграмму классов;
- узнаем, как использовать шаблон «Цепочка обязанностей» для решения различных задач;
- покажем, как создать классы обработчиков и связать их в цепочку так, чтобы сообщение было обработано последовательно каждым обработчиком;
- разберем возможности настройки приоритета и условий обработки определенных сообщений.
Занятие пройдёт 5 декабря в 20:00 мск в рамках курса «Архитектура и шаблоны проектирования». После урока вы сможете продолжить обучение в рассрочку.
Для бесплатного участия и получения записи пройдите короткое тестирование прямо сейчас: https://otus.pw/oyxg/
Расширять список своих скиллов! Начать можно с бесплатного открытого урока «Шаблон проектирования ""Цепочка обязанностей""» от OTUS.
На вебинаре:
- рассмотрим превращение элементов поведения в объекты;
- проанализируем его на конкретном примере, формируя диаграмму классов;
- узнаем, как использовать шаблон «Цепочка обязанностей» для решения различных задач;
- покажем, как создать классы обработчиков и связать их в цепочку так, чтобы сообщение было обработано последовательно каждым обработчиком;
- разберем возможности настройки приоритета и условий обработки определенных сообщений.
Занятие пройдёт 5 декабря в 20:00 мск в рамках курса «Архитектура и шаблоны проектирования». После урока вы сможете продолжить обучение в рассрочку.
Для бесплатного участия и получения записи пройдите короткое тестирование прямо сейчас: https://otus.pw/oyxg/
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru👍5🔥2
Как написать синглтон?
Singleton – это паттерн проектирования «одиночка», класс с единственным экземпляром. Такая пространная формулировка открывает простор для подходов к реализации, а значит и для уточняющих вопросов, на которые и рассчитывает интервьюер.
Первое что надо выяснить – единственный экземпляр в рамках чего. В базовом случае уникальность объекта обеспечивается на уровне реализации класса. Но при этом базовом подходе создается по объекту на каждый класслоадер. Для уникальности на всю виртуальную машину реализацию нужно дополнить. Понадобится больше действий уже на уровне ОС чтобы добиться единого экземпляра между процессами JVM. С другой стороны, может требоваться специфичное для фреймворка сужение «области уникальности», например по экземпляру на каждый Spring IoC-контейнер.
Затем вы узнаете, должен ли быть ровно один экземпляр, или не больше одного. Проще говоря, должно ли его создание быть ленивым. Возможно время использования объекта ограничено внешними условиями, и позднее он должен быть утилизирован.
И наконец нужно уточнить, в каких обстоятельствах подразумевается его использовать. Обычно предлагают условие многопоточной среды – инстанцирование необходимо синхронизировать. Другое возможное требование – сохранение состояния от запуска к запуску. Спектр опций здесь ограничивается только фантазией собеседующего.
Singleton – это паттерн проектирования «одиночка», класс с единственным экземпляром. Такая пространная формулировка открывает простор для подходов к реализации, а значит и для уточняющих вопросов, на которые и рассчитывает интервьюер.
Первое что надо выяснить – единственный экземпляр в рамках чего. В базовом случае уникальность объекта обеспечивается на уровне реализации класса. Но при этом базовом подходе создается по объекту на каждый класслоадер. Для уникальности на всю виртуальную машину реализацию нужно дополнить. Понадобится больше действий уже на уровне ОС чтобы добиться единого экземпляра между процессами JVM. С другой стороны, может требоваться специфичное для фреймворка сужение «области уникальности», например по экземпляру на каждый Spring IoC-контейнер.
Затем вы узнаете, должен ли быть ровно один экземпляр, или не больше одного. Проще говоря, должно ли его создание быть ленивым. Возможно время использования объекта ограничено внешними условиями, и позднее он должен быть утилизирован.
И наконец нужно уточнить, в каких обстоятельствах подразумевается его использовать. Обычно предлагают условие многопоточной среды – инстанцирование необходимо синхронизировать. Другое возможное требование – сохранение состояния от запуска к запуску. Спектр опций здесь ограничивается только фантазией собеседующего.
👍21🔥2
На вебинаре рассмотрим Virtual Threads (JEP444), которые наконец-то стали стабильными.
Узнаем:
- что в итоге получилось;
- как и зачем этим пользоваться.
После урока вы сможете продолжить обучение в рассрочку.
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ruPlease open Telegram to view this post
VIEW IN TELEGRAM
👍6🔥2
Какой результат выведет следующая программа?
Anonymous Quiz
27%
Equal
34%
Not equal
22%
Ошибку при выполнении
17%
Ошибку компиляции
🎉5❤2
Разберемся на бесплатном открытом уроке «Тактики работы с масштабируемостью» от OTUS.
✅ На вебинаре:
— изучим тактики и их преимущества и недостатки в различных сценариях;
— рассмотрим горизонтальное и вертикальное масштабирование, децентрализованный подход, автоматическое масштабирование и многопоточность;
— разберём принципы разделения функций и микросервисной архитектуры.
Занятие пройдёт 5 декабря в 20:00 мск и будет приурочено к старту курса «Software Architect». Курс возможно приобрести в рассрочку.
👉 Для бесплатного участия пройдите короткое тестирование прямо сейчас 👈
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ruPlease open Telegram to view this post
VIEW IN TELEGRAM
👍6🔥1
Когда Class.getClassLoader вернет null?
Этот вопрос поднимает две темы. Первая – класс Class в целом. Экземпляры Class<T> представляют runtime-описание типов. В терминах этого описания перечисления считаются классами, аннотации – интерфейсами. В основном приходится взаимодействовать с метаклассами при работе с рефлексией или загрузчиками.
По большей части эти экземпляры класса Class состоят из содержимого .class-файла. Создаются они только внутри класслоадера. Особенности их хранения в памяти обсуждаются в предыдущем посте.
Вторая тема для разговора здесь – особенности класса Class для примитивов, массивов и void. Для получения таких экземпляров используется тот же синтаксис, что и для обычных классов: void.class, int.class, float[][].class. Конструкция foo.class – это не обращение к члену, а литерал класса.
Для void типом-параметром T выступает специальный неинстанциируемый тип java.lang.Void. Тип-параметр примитива – соответствующий класс-враппер. Хотя для самого класса-враппера будет отдельный экземпляр Class. То есть int.class != Integer.class.
Метод getClassLoader обычного класса или интерфейса вернет загрузчик, который его загрузил. null может вернуться для загруженного bootstrap-класслоадером типа. Для массива возвращается то же, что для типа его элементов. Для примитивов и void результатом всегда будет null.
Этот вопрос поднимает две темы. Первая – класс Class в целом. Экземпляры Class<T> представляют runtime-описание типов. В терминах этого описания перечисления считаются классами, аннотации – интерфейсами. В основном приходится взаимодействовать с метаклассами при работе с рефлексией или загрузчиками.
По большей части эти экземпляры класса Class состоят из содержимого .class-файла. Создаются они только внутри класслоадера. Особенности их хранения в памяти обсуждаются в предыдущем посте.
Вторая тема для разговора здесь – особенности класса Class для примитивов, массивов и void. Для получения таких экземпляров используется тот же синтаксис, что и для обычных классов: void.class, int.class, float[][].class. Конструкция foo.class – это не обращение к члену, а литерал класса.
Для void типом-параметром T выступает специальный неинстанциируемый тип java.lang.Void. Тип-параметр примитива – соответствующий класс-враппер. Хотя для самого класса-враппера будет отдельный экземпляр Class. То есть int.class != Integer.class.
Метод getClassLoader обычного класса или интерфейса вернет загрузчик, который его загрузил. null может вернуться для загруженного bootstrap-класслоадером типа. Для массива возвращается то же, что для типа его элементов. Для примитивов и void результатом всегда будет null.
👍11🔥2💔1
Освоить один из самых популярных фреймворков на онлайн-курсе «Разработчик на Spring Framework» от OTUS.
Что даст вам курс:
✔️ Понимание, как создавать Web-приложения на микросервисной архитектуре и решать высокоуровневые задачи по разработке
✔️ Умение быстро проходить путь от идеи до production-grade
✔️ Владение фреймворками Spring и технологиями вспомогательных проектов (Spring MVC, Spring Security, Spring Boot, Spring Reactive Stack, Spring 5).
Вы можете заранее бесплатно получить полную программу, чтобы убедиться, что она вам подходит.
🎁 Черная пятница в OTUS! Успейте получить скидку 15% на курс!
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ruPlease open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥2🌚2
Чем отличается interface от @interface?
Среди интерфейсов выделяется особая группа, которая не объявляет никаких методов. Пример такого интерфейса – Serializable. Такие интерфейсы добавляют классу некую семантику, которая позже используется либо с помощью рефлексии (и instanceof), либо вообще не программно, а как информация для разработчиков и инструментов разработки. Это маркерные интерфейсы. Маркерный интерфейс представляет метаинформацию класса.
Начиная с Java 1.5 в языке появился новый вид типов – аннотации. Они берут на себя и расширяют возможности маркерного интерфейса:
1. Можно применять аннотацию не только к классу или интерфейсу, но почти к чему угодно: к пакетам, к методам, их параметрам, переменным. Полный список представлен в перечислении ElementType;
2. Аннотация может нести данные в своих элементах
3. Аннотация может не присутствовать в рантайме, или даже остаться только в исходнике, не попав в байткод вовсе. Определяется ее RetentionPolicy;
4. Можно сделать аннотацию не наследуемой, просто не помечая ее @Inherited;
5. И конечно же, синтаксис. Примененная аннотация с первого взгляда отличается от настоящих интерфейсов.
Joshua Block в главе 37 Effective Java выделяет два преимущества маркерных интерфейсов перед аннотациями на этапе компиляции:
1. Можно требовать использование только маркированного параметра, так как маркерный интерфейс – это еще и тип;
2. Можно сузить применяемость маркера к только определенным типам, сделав интерфейс их наследником.
Возвращаясь к вопросу, ключевое слово @interface объявляет аннотацию, interface – интерфейс.
В результате компиляции в .class-файле аннотация превращается в интерфейс-наследник java.lang.annotation.Annotation, помеченный флагом ACC_ANNOTATION. Элементы превращаются в абстрактные методы. Этим объясняется синтаксис объявления. Специфичные для аннотаций атрибуты описаны в JVMS 4.7.16-4.7.22.
К слову, конструкции вида @something в javadoc называются тэгами. Они выглядят похоже на аннотации, также представляют метаинформацию для документации, но технически не имеют с ними ничего общего.
Среди интерфейсов выделяется особая группа, которая не объявляет никаких методов. Пример такого интерфейса – Serializable. Такие интерфейсы добавляют классу некую семантику, которая позже используется либо с помощью рефлексии (и instanceof), либо вообще не программно, а как информация для разработчиков и инструментов разработки. Это маркерные интерфейсы. Маркерный интерфейс представляет метаинформацию класса.
Начиная с Java 1.5 в языке появился новый вид типов – аннотации. Они берут на себя и расширяют возможности маркерного интерфейса:
1. Можно применять аннотацию не только к классу или интерфейсу, но почти к чему угодно: к пакетам, к методам, их параметрам, переменным. Полный список представлен в перечислении ElementType;
2. Аннотация может нести данные в своих элементах
3. Аннотация может не присутствовать в рантайме, или даже остаться только в исходнике, не попав в байткод вовсе. Определяется ее RetentionPolicy;
4. Можно сделать аннотацию не наследуемой, просто не помечая ее @Inherited;
5. И конечно же, синтаксис. Примененная аннотация с первого взгляда отличается от настоящих интерфейсов.
Joshua Block в главе 37 Effective Java выделяет два преимущества маркерных интерфейсов перед аннотациями на этапе компиляции:
1. Можно требовать использование только маркированного параметра, так как маркерный интерфейс – это еще и тип;
2. Можно сузить применяемость маркера к только определенным типам, сделав интерфейс их наследником.
Возвращаясь к вопросу, ключевое слово @interface объявляет аннотацию, interface – интерфейс.
В результате компиляции в .class-файле аннотация превращается в интерфейс-наследник java.lang.annotation.Annotation, помеченный флагом ACC_ANNOTATION. Элементы превращаются в абстрактные методы. Этим объясняется синтаксис объявления. Специфичные для аннотаций атрибуты описаны в JVMS 4.7.16-4.7.22.
К слову, конструкции вида @something в javadoc называются тэгами. Они выглядят похоже на аннотации, также представляют метаинформацию для документации, но технически не имеют с ними ничего общего.
👍10🔥3😱2
This media is not supported in your browser
VIEW IN TELEGRAM
О чём расскажут эксперты по разработке и эксплуатации на YaTalks 2023
Делимся некоторыми темами ↓
«Интеграция Delivery Club и Яндекс Еды» — как объединяли приложения и сотрудников разных команд, как укладывались в сроки и какие уроки извлекли из этого опыта.
Никита Илясов, СТО, Яндекс Еда и Маркет Деливери
«Искусство бенчмаркинга и оптимизации распределённых баз данных на примере YDB» — как бенчмарки и оптимизация помогают работать с серверами, на которых лежат петабайты данных.
Евгений Иванов, старший разработчик программного обеспечения, Yandex Infrastructure
«Ускоритель в масштабе планеты: как инженеры управляют временем» — доклад о технологиях, которые увеличили скорость целых городов и стран, и о том, что происходит уже сейчас и ждёт нас в будущем.
Алексей Гусаков, технический директор, Яндекс Поиск
Эти и другие доклады можно послушать 5 декабря. Офлайн — в Москве и Белграде, онлайн — из любой точки мира. Если придёте лично, сможете поучаствовать в нетворкинге, полайвкодить с коллегами и посоветоваться с HR Яндекса, как написать резюме.
Всё бесплатно, регистрируйтесь ↓
Зарегистрироваться
Реклама. ООО "Яндекс". erid:2VtzqxQAFsM
Делимся некоторыми темами ↓
«Интеграция Delivery Club и Яндекс Еды» — как объединяли приложения и сотрудников разных команд, как укладывались в сроки и какие уроки извлекли из этого опыта.
Никита Илясов, СТО, Яндекс Еда и Маркет Деливери
«Искусство бенчмаркинга и оптимизации распределённых баз данных на примере YDB» — как бенчмарки и оптимизация помогают работать с серверами, на которых лежат петабайты данных.
Евгений Иванов, старший разработчик программного обеспечения, Yandex Infrastructure
«Ускоритель в масштабе планеты: как инженеры управляют временем» — доклад о технологиях, которые увеличили скорость целых городов и стран, и о том, что происходит уже сейчас и ждёт нас в будущем.
Алексей Гусаков, технический директор, Яндекс Поиск
Эти и другие доклады можно послушать 5 декабря. Офлайн — в Москве и Белграде, онлайн — из любой точки мира. Если придёте лично, сможете поучаствовать в нетворкинге, полайвкодить с коллегами и посоветоваться с HR Яндекса, как написать резюме.
Всё бесплатно, регистрируйтесь ↓
Зарегистрироваться
Реклама. ООО "Яндекс". erid:2VtzqxQAFsM
👍7❤2🔥2
Как узнать, является ли A подтипом B?
В Java доступны три способа проверки совместимости типов. Функционально они ничем не отличаются, применяются для разных наборов аргументов. В порядке убывания быстродействия:
instanceof – бинарный оператор, самый быстрый и самый используемый. Если есть экземпляр A и можно указать B явно, выбирать надо его. Если A (точнее тип хранящей экземпляр A переменной) и B не из одной цепочки наследования – экземпляр точно не может быть подтипом B и компиляция упадет с ошибкой inconvertible types.
Class::isInstance – метод принимает параметром объект типа A. Его стоит выбрать, когда экземпляр A в наличии, но B – неизвестный на этапе компиляции тип. То есть, для переменных A a и Class bClass, можем проверить bClass.isInstance(a).
Class::isAssignableFrom – принимает Class<A>. Единственное, что остается, если экземпляра A нет. bClass.isAssignableFrom(aClass).
Есть еще четвертый способ – имея экземпляр типа A привести его к B. Если типы были несовместимы, приведение выбросит ClassCastException. Это во всех смыслах плохой способ, построению логики программы на исключениях нет оправдания. Подробная аргументация описана в Effective Java Item 57.
В Java доступны три способа проверки совместимости типов. Функционально они ничем не отличаются, применяются для разных наборов аргументов. В порядке убывания быстродействия:
instanceof – бинарный оператор, самый быстрый и самый используемый. Если есть экземпляр A и можно указать B явно, выбирать надо его. Если A (точнее тип хранящей экземпляр A переменной) и B не из одной цепочки наследования – экземпляр точно не может быть подтипом B и компиляция упадет с ошибкой inconvertible types.
Class::isInstance – метод принимает параметром объект типа A. Его стоит выбрать, когда экземпляр A в наличии, но B – неизвестный на этапе компиляции тип. То есть, для переменных A a и Class bClass, можем проверить bClass.isInstance(a).
Class::isAssignableFrom – принимает Class<A>. Единственное, что остается, если экземпляра A нет. bClass.isAssignableFrom(aClass).
Есть еще четвертый способ – имея экземпляр типа A привести его к B. Если типы были несовместимы, приведение выбросит ClassCastException. Это во всех смыслах плохой способ, построению логики программы на исключениях нет оправдания. Подробная аргументация описана в Effective Java Item 57.
👍12🔥3❤1❤🔥1
📆28 ноября
🕗20:00 по МСК
Живой стрим с экспертами в больших данных, где ты узнаешь все для старта и развития карьеры. Сможешь задать вопросы в прямом эфире и получишь приятные бонусы!
🤓 для новичков, желающих зайти в data science / data analysis с нуля.
😎 junior-senior разработчиков.
😳 джунов в сфере данных, кому нужен вектор развития и новые кейсы.
Читай подробности и регистрируйся по ссылке 👇
[Бесплатная регистрация]
🕗20:00 по МСК
Живой стрим с экспертами в больших данных, где ты узнаешь все для старта и развития карьеры. Сможешь задать вопросы в прямом эфире и получишь приятные бонусы!
🤓 для новичков, желающих зайти в data science / data analysis с нуля.
😎 junior-senior разработчиков.
😳 джунов в сфере данных, кому нужен вектор развития и новые кейсы.
Читай подробности и регистрируйся по ссылке 👇
[Бесплатная регистрация]
👍5🔥2
Что такое Reflection и как его использовать?
Reflection, рефлексия – это средства манипуляции данными на основе знания о структуре классов этих данных, инструменты метапрограммирования.
Класс Class<T> используется как точка входа в мир рефлекшена. Его экземпляры предоставляют саму метаинформацию о содержимом класса и основные методы для работы с ним. Все классы относящиеся Java Reflection находятся в пакетах java.lang и java.lang.reflect.
Экземпляр класса Class можно получить тремя способами:
🔘 Литералом .class;
🔘 Статическим фабричным методом Class.forName();
🔘 Методом getClass() экземпляров класса.
Использование Reflection API медленное и небезопасное. Оно позволяет ломать инвариантность состояний экземпляра, нарушать инкапсуляцию, и даже менять финальные поля.
Использовать рефлексию естественно в тестовом коде, в инструментах разработки, в фреймворках (особенно в связке с runtime-аннотациями). Рефлекшн в ординарном бизнес-коде обычно говорит о больших проблемах проектирования.
Нередко на интервью просят продемонстрировать пример использования рефлекшна. Один из самых близких для backend-разработчика примеров – инициализация классов-конфигураций в Spring Framework. Фреймворк с помощью рефлекшна сканирует внутренности таких классов. Поля и методы, помеченные специальными аннотациями, воспринимаются как объявления элементов экосистемы фреймворка.
Reflection, рефлексия – это средства манипуляции данными на основе знания о структуре классов этих данных, инструменты метапрограммирования.
Класс Class<T> используется как точка входа в мир рефлекшена. Его экземпляры предоставляют саму метаинформацию о содержимом класса и основные методы для работы с ним. Все классы относящиеся Java Reflection находятся в пакетах java.lang и java.lang.reflect.
Экземпляр класса Class можно получить тремя способами:
🔘 Литералом .class;
🔘 Статическим фабричным методом Class.forName();
🔘 Методом getClass() экземпляров класса.
Использование Reflection API медленное и небезопасное. Оно позволяет ломать инвариантность состояний экземпляра, нарушать инкапсуляцию, и даже менять финальные поля.
Использовать рефлексию естественно в тестовом коде, в инструментах разработки, в фреймворках (особенно в связке с runtime-аннотациями). Рефлекшн в ординарном бизнес-коде обычно говорит о больших проблемах проектирования.
Нередко на интервью просят продемонстрировать пример использования рефлекшна. Один из самых близких для backend-разработчика примеров – инициализация классов-конфигураций в Spring Framework. Фреймворк с помощью рефлекшна сканирует внутренности таких классов. Поля и методы, помеченные специальными аннотациями, воспринимаются как объявления элементов экосистемы фреймворка.
👍15🔥4
🔥Путь в Java-разработке с нуля и до Middle за 15 месяцев
Уже 29 декабря стартует новая группа специализации «Java Developer» в OTUS.
💪 С нуля до Middle за 15 месяцев!
На онлайн-курсе вы получите:
✔️ Уникальные знания от преподавателей — Senior Java-разработчиков ведущих IT-компаний.
✔️ Практику создания реальных проектов — разработка своего серверного приложения на Java
✔️ Актуальные навыки, необходимые для трудоустройства Middle Java-разработчиком
✔️ Вы освоите инструменты: IntelliJ IDEA, Java Development Kit (JDK), Spring Framework, Hibernate, PostgreSQL, Apache Maven, Gradle, Docker, Kubernetes, Apache Kafka, RabbitMQ, JUnit, Postman, Jira.
👉 Получить специальные условия на курс можно оставив заявку по ссылке: https://otus.pw/tIFm/
Уже 29 декабря стартует новая группа специализации «Java Developer» в OTUS.
На онлайн-курсе вы получите:
✔️ Уникальные знания от преподавателей — Senior Java-разработчиков ведущих IT-компаний.
✔️ Практику создания реальных проектов — разработка своего серверного приложения на Java
✔️ Актуальные навыки, необходимые для трудоустройства Middle Java-разработчиком
✔️ Вы освоите инструменты: IntelliJ IDEA, Java Development Kit (JDK), Spring Framework, Hibernate, PostgreSQL, Apache Maven, Gradle, Docker, Kubernetes, Apache Kafka, RabbitMQ, JUnit, Postman, Jira.
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ruPlease open Telegram to view this post
VIEW IN TELEGRAM
👍5🥱2🔥1🐳1