Зачем нужен загрузчик классов?
В Java используется динамическая загрузка классов. Ее выполняют загрузчики – наследники абстрактного класса ClassLoader. Кроме того, они же загружают и файлы-ресурсы.
Загрузка класса (точнее любого ссылочного типа) и всех его предков происходит автоматически перед его инициализацией. При этом используется тот лоадер, который загрузил текущий код. Таким образом, загрузка всех, даже встроенных классов – ленивая.
Вручную класс можно загрузить из конкретного загрузчика, передав аргументом его метода
В URLClassLoader и стандартных загрузчиках JVM источником класса служит .class-файл. Другие загрузчики в своей реализации используют и другие источники: это может быть сетевой ресурс, или класс может генерироваться в рантайме. К примеру загрузчик из javassist специализируется на создании классов на лету.
В результате загрузки создается экземпляр класса Class. В отличие от обычных объектов, такие экземпляры хранятся не в куче, а в permgen/metaspace.
#Классы
В Java используется динамическая загрузка классов. Ее выполняют загрузчики – наследники абстрактного класса ClassLoader. Кроме того, они же загружают и файлы-ресурсы.
Загрузка класса (точнее любого ссылочного типа) и всех его предков происходит автоматически перед его инициализацией. При этом используется тот лоадер, который загрузил текущий код. Таким образом, загрузка всех, даже встроенных классов – ленивая.
Вручную класс можно загрузить из конкретного загрузчика, передав аргументом его метода
loadClass
бинарное имя класса.В URLClassLoader и стандартных загрузчиках JVM источником класса служит .class-файл. Другие загрузчики в своей реализации используют и другие источники: это может быть сетевой ресурс, или класс может генерироваться в рантайме. К примеру загрузчик из javassist специализируется на создании классов на лету.
В результате загрузки создается экземпляр класса Class. В отличие от обычных объектов, такие экземпляры хранятся не в куче, а в permgen/metaspace.
Class
может быть выгружен, когда загрузивший его ClassLoader
стал мусором.#Классы
👍7❤1
Какие существуют стандартные загрузчики классов?
В JVM встроено как минимум три стандартных загрузчика:
🔘 Bootstrap – встроенная в JVM нативная реализация, родитель для всех остальных загрузчиков. Загружает часть стандартных классов
🔘 Platform – отвечает за загрузку стандартных классов Java-рантайма. До Java 9 назывался Extension и занимался загрузкой расширений. Гарантируется, что ему будут видны (но не факт что загружены непосредственно им) все стандартные классы Java SE и JDK;
🔘 System (Application) – загружает классы из classpath конкретного приложения;
Перед тем как загрузить класс,
Иллюстрация смысла этой иерархии – загрузчики 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 у каждого приложения будет собственный. Системные классы и общие библиотеки при том грузятся их родительскими загрузчиками, только один раз для сервера.
#Классы
Wikipedia
Classpath
Classpath is a parameter in the Java Virtual Machine or the Java compiler that specifies the location of user-defined classes and packages. The parameter may be set either on the command-line, or through an environment variable.
👍6
Лучшие практики Unit-тестирования на Java
Unit-тестирование - важный шаг в разработке и внедрении программного обеспечения. Оно не только повышает эффективность и результативность кода, но также делает его более надежным.
В этом руководстве мы обсудим несколько лучших практик Unit-тестирования на Java, а именно:
- именование пакетов
- размещение кода с тестами
- именование методов
и многое другое
Читать статью
Unit-тестирование - важный шаг в разработке и внедрении программного обеспечения. Оно не только повышает эффективность и результативность кода, но также делает его более надежным.
В этом руководстве мы обсудим несколько лучших практик Unit-тестирования на Java, а именно:
- именование пакетов
- размещение кода с тестами
- именование методов
и многое другое
Читать статью
Baeldung on Kotlin
Best Practices for Unit Testing in Java | Baeldung
Learn about best practices for unit testing in Java.
👍2
Forwarded from Академия Кода
Как удалить директорию в java?
Вы можете использовать File.delete() для удаления директории.
#java
Подписывайтесь на канал 👉@coddy_academy
Вы можете использовать File.delete() для удаления директории.
import java.io.File;
class Main {
public static void main(String[] args) throws Exception {
File file = new File("delete_folder");
if (file.delete()){
System.out.println("Директория успешно удалена");
}
}
}
#java
Подписывайтесь на канал 👉@coddy_academy
💩9👍7
Подборка интересных каналов 🔥
DeepFake
На канале публикуем deepfake видео и связанные с ними технологии.
https://t.me/deepfakenow
Мир технологий (Technology World)
Добро пожаловать в мир технологий
https://t.me/mir_teh
GitHub Сообщество
https://t.me/Githublib
Реальный Python
Все о пайтон, новости, подборки на русском и английском.
https://t.me/python_real
BigData
Data Science : Big Data : Machine Learning : Deep Learning
https://t.me/bigdata_1
Базы данных (Data Base)
https://t.me/database_info
Книги для программистов Rus
https://t.me/book_for_dev
DevOps
Пишем о Docker, Kubernetes и др.
https://t.me/i_DevOps
Типичный Сисадмин
Админский юмор, фото железа, было/стало, все здесь!
https://t.me/tipsysdmin
Python академия
Учи Python быстро и легко.
https://t.me/pythonofff
Coddy
Академия кода.
https://t.me/coddy_academy
Bitkoinoff - новости криптовалют
Все самое важное о криптовалютах и блокчейне
https://t.me/bitkoinoff
Сообщество Дизайнеров
https://t.me/ux_web
GameDev: разработка игр
https://t.me/game_devv
DeepFake
На канале публикуем deepfake видео и связанные с ними технологии.
https://t.me/deepfakenow
Мир технологий (Technology World)
Добро пожаловать в мир технологий
https://t.me/mir_teh
GitHub Сообщество
https://t.me/Githublib
Реальный Python
Все о пайтон, новости, подборки на русском и английском.
https://t.me/python_real
BigData
Data Science : Big Data : Machine Learning : Deep Learning
https://t.me/bigdata_1
Базы данных (Data Base)
https://t.me/database_info
Книги для программистов Rus
https://t.me/book_for_dev
DevOps
Пишем о Docker, Kubernetes и др.
https://t.me/i_DevOps
Типичный Сисадмин
Админский юмор, фото железа, было/стало, все здесь!
https://t.me/tipsysdmin
Python академия
Учи Python быстро и легко.
https://t.me/pythonofff
Coddy
Академия кода.
https://t.me/coddy_academy
Bitkoinoff - новости криптовалют
Все самое важное о криптовалютах и блокчейне
https://t.me/bitkoinoff
Сообщество Дизайнеров
https://t.me/ux_web
GameDev: разработка игр
https://t.me/game_devv
👍4
Чем отличается перегрузка от переопределения? (1/2)
Полиморфизм – соль ООП. Перегрузка (overload) и переопределение (override) – два инструмента достижения полиморфного поведения в Java.
Перегрузкой реализуется ad-hoc-полиморфизм. Это значит «один и тот же» метод может работать с разными параметрами. С технической точки зрения это просто два разных метода, сигнатуры которых имеют одинаковое название, но разный набор параметров. Важно помнить, что для перегрузки не достаточно различий только модификаторов, возвращаемых типов и списков исключений.
Ad-hoc – не совсем настоящий полиморфизм, так как при нём используется раннее, или статическое связывание (early binding, static dispatch). Это значит, что для выбора конкретного варианта метода используется информация о типе переменной, а не объекта в ней лежащего, и происходит это еще при компиляции.
Если в классе объявлены два перегруженных метода, а аргумент в вызове подходит под оба, случится ошибка компиляции. В примере ниже компилятор не может выбрать между вариантами метода
#Классы
Полиморфизм – соль ООП. Перегрузка (overload) и переопределение (override) – два инструмента достижения полиморфного поведения в Java.
Перегрузкой реализуется ad-hoc-полиморфизм. Это значит «один и тот же» метод может работать с разными параметрами. С технической точки зрения это просто два разных метода, сигнатуры которых имеют одинаковое название, но разный набор параметров. Важно помнить, что для перегрузки не достаточно различий только модификаторов, возвращаемых типов и списков исключений.
Ad-hoc – не совсем настоящий полиморфизм, так как при нём используется раннее, или статическое связывание (early binding, static dispatch). Это значит, что для выбора конкретного варианта метода используется информация о типе переменной, а не объекта в ней лежащего, и происходит это еще при компиляции.
Если в классе объявлены два перегруженных метода, а аргумент в вызове подходит под оба, случится ошибка компиляции. В примере ниже компилятор не может выбрать между вариантами метода
println
с параметром char[]
и со String
, так как null
может быть и тем и другим.#Классы
👍11
Forwarded from Академия Кода
Как проверить содержится ли элемент в массиве на java?
Вы можете использовать условие и цикл для проверки существования элемента в массиве.
#java
Подписывайтесь на канал 👉@coddy_academy
Вы можете использовать условие и цикл для проверки существования элемента в массиве.
class Main {
public static void main(String[] args) throws Exception {
int[] firstArray = new int[]{52, 21, 94, 29, 91};
int[] secondArray = new int[]{82, 74, 51, 39, 23};
int element = 21;
for (int i = 0; i < firstArray.length; i++) {
if (firstArray[i] == element){
System.out.println(element + " in first array");
}
}
for (int i = 0; i < secondArray.length; i++) {
if (secondArray[i] == element){
System.out.println(element + " in second array");
}
}
// Вывод : 21 in first array
}
}
#java
Подписывайтесь на канал 👉@coddy_academy
👎16👍1💩1
Чем отличается перегрузка от переопределения? (2/2) Часть 1
Переопределение (override) дает полиморфизм подтипов. Это реализация/подмена метода нефинального родительского класса или интерфейса. С помощью этого механизма достигается поведение, когда экземпляр хранится под типом родителя, но реализация методов используется специфичная для этого конкретного подтипа. Пример:
Здесь метод add вызывается общий для всех списков, но добавлен будет именно элемент связного списка.
Выбор конкретного метода происходит в последний момент, в процессе работы программы, в зависимости от типа объекта. Это называется позднее или динамическое связывание методов (late binding, dynamic dispatch).
Переопределение имеет непосредственное отношение к принципу подстановки Лисков (LSP): в хорошем объектно-ориентированном коде для вызывающего кода переопределенный метод не должен быть отличим от оригинального.
Переопределенный метод принято снабжать аннотацией
При переопределении можно сузить набор выбрасываемых исключений или тип результата, и заменить модификатор доступа на менее строгий.
Статические методы нельзя переопределить, можно только перегрузить.
О внутренностях процесса связывания можно почитать в этой статье.
#Классы
Переопределение (override) дает полиморфизм подтипов. Это реализация/подмена метода нефинального родительского класса или интерфейса. С помощью этого механизма достигается поведение, когда экземпляр хранится под типом родителя, но реализация методов используется специфичная для этого конкретного подтипа. Пример:
List<String> list = new LinkedList<>();
list.add(“foo“);
Здесь метод add вызывается общий для всех списков, но добавлен будет именно элемент связного списка.
Выбор конкретного метода происходит в последний момент, в процессе работы программы, в зависимости от типа объекта. Это называется позднее или динамическое связывание методов (late binding, dynamic dispatch).
Переопределение имеет непосредственное отношение к принципу подстановки Лисков (LSP): в хорошем объектно-ориентированном коде для вызывающего кода переопределенный метод не должен быть отличим от оригинального.
Переопределенный метод принято снабжать аннотацией
@Override
. Ее отсутствие допускается, но компиляция не перегружающего метода с такой аннотацией приведет к ошибке. При переопределении можно сузить набор выбрасываемых исключений или тип результата, и заменить модификатор доступа на менее строгий.
Статические методы нельзя переопределить, можно только перегрузить.
О внутренностях процесса связывания можно почитать в этой статье.
#Классы
👍5
Предположим, есть метод, который может выбросить IOException и FileNotFoundException. в какой последовательности должны идти блоки catch? Сколько блоков catch будет выполнено?
Общее правило: обрабатывать исключения нужно от «младшего» к старшему. Т.е. нельзя поставить в первый блок
Таким образом, исходя из факта, что
Общее правило: обрабатывать исключения нужно от «младшего» к старшему. Т.е. нельзя поставить в первый блок
catch(Exception ex) {}
, иначе все дальнейшие блоки catch()
уже ничего не смогут обработать, т.к. любое исключение будет соответствовать обработчику catch(Exception ex)
.Таким образом, исходя из факта, что
FileNotFoundException extends
IOException
сначала нужно обработать FileNotFoundException
, а затем уже IOException
:void method() {
try {
//...
} catch (FileNotFoundException ex) {
//...
} catch (IOException ex) {
//...
}
}
👍6
Какие ограничения на целостность данных существуют в SQL?
PRIMARY KEY - набор полей (1 или более), значения которых образуют уникальную комбинацию и используются для однозначной идентификации записи в таблице. Для таблицы может быть создано только одно такое ограничение. Данное ограничение используется для обеспечения целостности сущности, которая описана таблицей.
CHECK используется для ограничения множества значений, которые могут быть помещены в данный столбец. Это ограничение используется для обеспечения целостности предметной области, которую описывают таблицы в базе.
UNIQUE обеспечивает отсутствие дубликатов в столбце или наборе столбцов.
FOREIGN KEY защищает от действий, которые могут нарушить связи между таблицами. FOREIGN KEY в одной таблице указывает на PRIMARY KEY в другой. Поэтому данное ограничение нацелено на то, чтобы не было записей FOREIGN KEY, которым не отвечают записи PRIMARY KEY.
PRIMARY KEY - набор полей (1 или более), значения которых образуют уникальную комбинацию и используются для однозначной идентификации записи в таблице. Для таблицы может быть создано только одно такое ограничение. Данное ограничение используется для обеспечения целостности сущности, которая описана таблицей.
CHECK используется для ограничения множества значений, которые могут быть помещены в данный столбец. Это ограничение используется для обеспечения целостности предметной области, которую описывают таблицы в базе.
UNIQUE обеспечивает отсутствие дубликатов в столбце или наборе столбцов.
FOREIGN KEY защищает от действий, которые могут нарушить связи между таблицами. FOREIGN KEY в одной таблице указывает на PRIMARY KEY в другой. Поэтому данное ограничение нацелено на то, чтобы не было записей FOREIGN KEY, которым не отвечают записи PRIMARY KEY.
👍6
Актуальное руководство по запуску Java-приложений в контейнерах Docker.
https://sematext.com/blog/docker-java-tutorial/
https://sematext.com/blog/docker-java-tutorial/
Sematext
How to Containerize Java Web Applications with Docker
Learn how to use Docker to containerize your Java web application. Step-by-step tutorial to help devs create, view and tag Docker.
Можно ли использовать строки в конструкции switch?
Да, начиная с Java 7 в операторе
• участвующие строки чувствительны к регистру;
• используется метод
• согласно документации, Java 7 для строк в
Да, начиная с Java 7 в операторе
switch
можно использовать строки, ранние версии Java не поддерживают этого. При этом:• участвующие строки чувствительны к регистру;
• используется метод
equals()
для сравнения полученного значения со значениями case
, поэтому во избежание NullPointerException
стоит предусмотреть проверку на null
.• согласно документации, Java 7 для строк в
switch
, компилятор Java формирует более эффективный байткод для строк в конструкции switch
, чем для сцепленных условий if-else
.👍4
Что действительно важно знать о трудоустройстве за границей
Митап с Senior Technical HR Lead Amazon Эльвирой Шустровой
🤔 Кто лучше всего знает, как айтишнику устроиться в зарубежную компанию? Конечно же, HR, который ежедневно нанимает технических специалистов.
В эту среду вы узнаете секреты трудоустройства в крупные зарубежные компании из первых рук — от International Tech Recruiter Эльвиры Шустровой (USA).
Обсудим:
👉 Что лучше: размещать резюме на HR-сайтах и ждать, что тебя заметят, или сразу стучаться в компании, которые близки по духу?
👉 Какие отличия есть в оформлении резюме (CV) для российских и зарубежных работодателей? Чем отличается процесс интервью?
👉 Насколько точно по навыкам должен совпадать соискатель с запросом компании? Если я не соответствую всему списку требований — это провал?
👉 Как устроиться в Amazon на удалёнку тестировщиком? А junior-разработчиком?
... и огромное количество других вопросов о том, как русскоязычному айтишнику устроиться в зарубежную компанию.
🎙 О спикере: Эльвира Шустрова более пяти лет она живёт в США и занимается наймом технических специалистов в международные компании. В её послужном списке ЦФТ, Unlimint (CardPay), Amazon и другие известные бренды.
🗓 Когда: 27 апреля (среда) в 19:00 мск
📍 Где: митап пройдёт в онлайне в телеграм-канале RelocationDEV. Подписывайтесь на канал, чтобы не пропустить начало трансляции.
До встречи в среду!😉
Митап с Senior Technical HR Lead Amazon Эльвирой Шустровой
🤔 Кто лучше всего знает, как айтишнику устроиться в зарубежную компанию? Конечно же, HR, который ежедневно нанимает технических специалистов.
В эту среду вы узнаете секреты трудоустройства в крупные зарубежные компании из первых рук — от International Tech Recruiter Эльвиры Шустровой (USA).
Обсудим:
👉 Что лучше: размещать резюме на HR-сайтах и ждать, что тебя заметят, или сразу стучаться в компании, которые близки по духу?
👉 Какие отличия есть в оформлении резюме (CV) для российских и зарубежных работодателей? Чем отличается процесс интервью?
👉 Насколько точно по навыкам должен совпадать соискатель с запросом компании? Если я не соответствую всему списку требований — это провал?
👉 Как устроиться в Amazon на удалёнку тестировщиком? А junior-разработчиком?
... и огромное количество других вопросов о том, как русскоязычному айтишнику устроиться в зарубежную компанию.
🎙 О спикере: Эльвира Шустрова более пяти лет она живёт в США и занимается наймом технических специалистов в международные компании. В её послужном списке ЦФТ, Unlimint (CardPay), Amazon и другие известные бренды.
🗓 Когда: 27 апреля (среда) в 19:00 мск
📍 Где: митап пройдёт в онлайне в телеграм-канале RelocationDEV. Подписывайтесь на канал, чтобы не пропустить начало трансляции.
До встречи в среду!😉
Как написать синглтон?
Singleton – это паттерн проектирования «одиночка», класс с единственным экземпляром. Такая пространная формулировка открывает простор для подходов к реализации, а значит и для уточняющих вопросов, на которые и рассчитывает интервьюер.
Первое что надо выяснить – единственный экземпляр в рамках чего. В базовом случае уникальность объекта обеспечивается на уровне реализации класса. Но при этом базовом подходе создается по объекту на каждый класслоадер. Для уникальности на всю виртуальную машину реализацию нужно дополнить. Понадобится больше действий уже на уровне ОС чтобы добиться единого экземпляра между процессами JVM. С другой стороны, может требоваться специфичное для фреймворка сужение «области уникальности», например по экземпляру на каждый Spring IoC-контейнер.
Затем вы узнаете, должен ли быть ровно один экземпляр, или не больше одного. Проще говоря, должно ли его создание быть ленивым. Возможно время использования объекта ограничено внешними условиями, и позднее он должен быть утилизирован.
И наконец нужно уточнить, в каких обстоятельствах подразумевается его использовать. Обычно предлагают условие многопоточной среды – инстанцирование необходимо синхронизировать. Другое возможное требование – сохранение состояния от запуска к запуску. Спектр опций здесь ограничивается только фантазией собеседующего.
О вариантах конкретных реализаций написано много статей. Обычно на интервью ожидается знание самых стандартных подходов, которые описаны например здесь.
#Классы
Singleton – это паттерн проектирования «одиночка», класс с единственным экземпляром. Такая пространная формулировка открывает простор для подходов к реализации, а значит и для уточняющих вопросов, на которые и рассчитывает интервьюер.
Первое что надо выяснить – единственный экземпляр в рамках чего. В базовом случае уникальность объекта обеспечивается на уровне реализации класса. Но при этом базовом подходе создается по объекту на каждый класслоадер. Для уникальности на всю виртуальную машину реализацию нужно дополнить. Понадобится больше действий уже на уровне ОС чтобы добиться единого экземпляра между процессами JVM. С другой стороны, может требоваться специфичное для фреймворка сужение «области уникальности», например по экземпляру на каждый Spring IoC-контейнер.
Затем вы узнаете, должен ли быть ровно один экземпляр, или не больше одного. Проще говоря, должно ли его создание быть ленивым. Возможно время использования объекта ограничено внешними условиями, и позднее он должен быть утилизирован.
И наконец нужно уточнить, в каких обстоятельствах подразумевается его использовать. Обычно предлагают условие многопоточной среды – инстанцирование необходимо синхронизировать. Другое возможное требование – сохранение состояния от запуска к запуску. Спектр опций здесь ограничивается только фантазией собеседующего.
О вариантах конкретных реализаций написано много статей. Обычно на интервью ожидается знание самых стандартных подходов, которые описаны например здесь.
#Классы
👍9🔥5
Что такое MIME тип?
MIME, Multipurpose Internet Mail Extension (Многоцелевые расширения Интернет-почты) — спецификация для передачи по сети файлов различного типа: изображений, музыки, текстов, видео, архивов и др. В HTML указание MIME-типа используется при передаче данных форм и вставки на страницу различных объектов.
MIME, Multipurpose Internet Mail Extension (Многоцелевые расширения Интернет-почты) — спецификация для передачи по сети файлов различного типа: изображений, музыки, текстов, видео, архивов и др. В HTML указание MIME-типа используется при передаче данных форм и вставки на страницу различных объектов.
👍7
Что такое «авторизация» и «аутентификация»? Чем они отличаются?
Аутентификация - это проверка соответствия субъекта и того, за кого он пытается себя выдать, с помощью некой уникальной информации, в простейшем случае - с помощью имени входа и пароля.
Авторизация - это проверка и определение полномочий на выполнение некоторых действий (например, чтение файла) в соответствии с ранее выполненной аутентификацией.
Очевидно, что это разные понятия, но при этом без первого не может быть второго и наоборот. То есть имея разрешение на работу, вы не сможете оказаться на рабочем месте без предъявления пропуска, равно как и нет смысла в демонстрации пропуска, если вы не планируете работать. Именно тот факт, что одного не бывает без другого, и вызывает у людей заблуждение, что это одно и то же.
Аутентификация - это проверка соответствия субъекта и того, за кого он пытается себя выдать, с помощью некой уникальной информации, в простейшем случае - с помощью имени входа и пароля.
Авторизация - это проверка и определение полномочий на выполнение некоторых действий (например, чтение файла) в соответствии с ранее выполненной аутентификацией.
Очевидно, что это разные понятия, но при этом без первого не может быть второго и наоборот. То есть имея разрешение на работу, вы не сможете оказаться на рабочем месте без предъявления пропуска, равно как и нет смысла в демонстрации пропуска, если вы не планируете работать. Именно тот факт, что одного не бывает без другого, и вызывает у людей заблуждение, что это одно и то же.
👍11
🧐 Какую литературу почитать про проектирование и микросервисы? Как ускорить поставку ПО и почему за ИТ будущее?
Всем этим и не только делятся ребята из Почтатеха. Лайфхаки, инсайты и внутренняя жизнь ИТ-компании — всё, как мы любим.
🔸 Почему это круто? Полезную инфу можно найти и начинающим гикам, и уже опытным спецам.
🔸 Что за контент? Выжимки из статей на Хабре, собственные инженерные решения, релизы из первых уст и классный бонус — актуальные вакансии и советы для карьеры.
🔸 Где можно подписаться? 👉 Вот тут: @pochtatech
Всем этим и не только делятся ребята из Почтатеха. Лайфхаки, инсайты и внутренняя жизнь ИТ-компании — всё, как мы любим.
🔸 Почему это круто? Полезную инфу можно найти и начинающим гикам, и уже опытным спецам.
🔸 Что за контент? Выжимки из статей на Хабре, собственные инженерные решения, релизы из первых уст и классный бонус — актуальные вакансии и советы для карьеры.
🔸 Где можно подписаться? 👉 Вот тут: @pochtatech
👍4
Подборка каналов для IT специалистов 🎯
Системное администрирование 📌
https://t.me/tipsysdmin Типичный Сисадмин (фото железа, было/стало)
https://t.me/sysadminof Книги для админов, полезные материалы
https://t.me/i_odmin Все для системного администратора
https://t.me/i_odmin_book Библиотека Системного Администратора
https://t.me/i_odmin_chat Чат системных администраторов
https://t.me/i_DevOps DevOps: Пишем о Docker, Kubernetes и др.
GitHub Сообщество 📌
https://t.me/Githublib Интересное из GitHub
CodePen 📌
https://t.me/codepen_1 Сообщество пользователей CodePen
Базы данных (Data Base) 📌
https://t.me/database_info Все про базы данных
Вакансии для программистов 📌
https://t.me/progjob
Программирование Python 📌
https://t.me/pythonofff Python академия. Учи Python быстро и легко🐍
https://t.me/BookPython Библиотека Python разработчика
https://t.me/python_real Python подборки на русском и английском
Мобильная разработка: iOS, Android 📌
https://t.me/developer_mobila Мобильная разработка
Фронтенд разработка 📌
https://t.me/frontend_1 Подборки для frontend разработчиков
Java разработка 📌
https://t.me/BookJava Библиотека Java разработчика
Разработка игр 📌
https://t.me/game_devv Все о разработке игр
Библиотеки 📌
https://t.me/book_for_dev Книги для программистов Rus
https://t.me/programmist_of Книги по программированию
https://t.me/proglb Библиотека программиста
https://t.me/bfbook Книги для программистов
БигДата, машинное обучение 📌
https://t.me/bigdata_1 Data Science, Big Data, Machine Learning, Deep Learning
Программирование 📌
https://t.me/bookflow Лекции, видеоуроки, доклады с IT конференций
https://t.me/coddy_academy Полезные советы по программированию
QA, тестирование 📌
https://t.me/testlab_qa Библиотека тестировщика
Шутки программистов 📌
https://t.me/itumor Шутки программистов
Защита, взлом, безопасность 📌
https://t.me/thehaking Канал о кибербезопасности
Книги, статьи для дизайнеров 📌
https://t.me/ux_web Статьи, книги для дизайнеров
Английский 📌
https://t.me/UchuEnglish Английский с нуля
Математика 📌
https://t.me/Pomatematike Канал по математике
Арбитраж трафика 📌
https://t.me/partnerochkin CPA и арбитраж трафика
Крипта 📌
https://t.me/bitkoinoff Новости криптовалют
DeepFake 📌
https://t.me/deepfakenow Публикуем deepfake видео
Мир технологий 📌
https://t.me/mir_teh Видео из мира технологий
Системное администрирование 📌
https://t.me/tipsysdmin Типичный Сисадмин (фото железа, было/стало)
https://t.me/sysadminof Книги для админов, полезные материалы
https://t.me/i_odmin Все для системного администратора
https://t.me/i_odmin_book Библиотека Системного Администратора
https://t.me/i_odmin_chat Чат системных администраторов
https://t.me/i_DevOps DevOps: Пишем о Docker, Kubernetes и др.
GitHub Сообщество 📌
https://t.me/Githublib Интересное из GitHub
CodePen 📌
https://t.me/codepen_1 Сообщество пользователей CodePen
Базы данных (Data Base) 📌
https://t.me/database_info Все про базы данных
Вакансии для программистов 📌
https://t.me/progjob
Программирование Python 📌
https://t.me/pythonofff Python академия. Учи Python быстро и легко🐍
https://t.me/BookPython Библиотека Python разработчика
https://t.me/python_real Python подборки на русском и английском
Мобильная разработка: iOS, Android 📌
https://t.me/developer_mobila Мобильная разработка
Фронтенд разработка 📌
https://t.me/frontend_1 Подборки для frontend разработчиков
Java разработка 📌
https://t.me/BookJava Библиотека Java разработчика
Разработка игр 📌
https://t.me/game_devv Все о разработке игр
Библиотеки 📌
https://t.me/book_for_dev Книги для программистов Rus
https://t.me/programmist_of Книги по программированию
https://t.me/proglb Библиотека программиста
https://t.me/bfbook Книги для программистов
БигДата, машинное обучение 📌
https://t.me/bigdata_1 Data Science, Big Data, Machine Learning, Deep Learning
Программирование 📌
https://t.me/bookflow Лекции, видеоуроки, доклады с IT конференций
https://t.me/coddy_academy Полезные советы по программированию
QA, тестирование 📌
https://t.me/testlab_qa Библиотека тестировщика
Шутки программистов 📌
https://t.me/itumor Шутки программистов
Защита, взлом, безопасность 📌
https://t.me/thehaking Канал о кибербезопасности
Книги, статьи для дизайнеров 📌
https://t.me/ux_web Статьи, книги для дизайнеров
Английский 📌
https://t.me/UchuEnglish Английский с нуля
Математика 📌
https://t.me/Pomatematike Канал по математике
Арбитраж трафика 📌
https://t.me/partnerochkin CPA и арбитраж трафика
Крипта 📌
https://t.me/bitkoinoff Новости криптовалют
DeepFake 📌
https://t.me/deepfakenow Публикуем deepfake видео
Мир технологий 📌
https://t.me/mir_teh Видео из мира технологий
Чем отличается interface от @interface?
Среди интерфейсов выделяется особая группа, которая не объявляет никаких методов. Пример такого интерфейса –
Начиная с Java 1.5 в языке появился новый вид типов – аннотации. Они берут на себя и расширяют возможности маркерного интерфейса:
1. Можно применять аннотацию не только к классу или интерфейсу, но почти к чему угодно: к пакетам, к методам, их параметрам, переменным. Полный список представлен в перечислении ElementType;
2. Аннотация может нести данные в своих элементах
3. Аннотация может не присутствовать в рантайме, или даже остаться только в исходнике, не попав в байткод вовсе. Определяется ее RetentionPolicy;
4. Можно сделать аннотацию не наследуемой, просто не помечая ее
5. И конечно же, синтаксис. Примененная аннотация с первого взгляда отличается от настоящих интерфейсов.
Joshua Block в главе 37 Effective Java выделяет два преимущества маркерных интерфейсов перед аннотациями на этапе компиляции:
1. Можно требовать использование только маркированного параметра, так как маркерный интерфейс – это еще и тип;
2. Можно сузить применяемость маркера к только определенным типам, сделав интерфейс их наследником.
Возвращаясь к вопросу, ключевое слово
В результате компиляции в .class-файле аннотация превращается в интерфейс-наследник
К слову, конструкции вида
#Классы
#Аннотации
Среди интерфейсов выделяется особая группа, которая не объявляет никаких методов. Пример такого интерфейса –
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 называются тэгами. Они выглядят похоже на аннотации, также представляют метаинформацию для документации, но технически не имеют с ними ничего общего.#Классы
#Аннотации
👍11🔥1