🚀Java с JMH для бенчмаркинга 🚀
Создайте класс бенчмарка для измерения производительности конкретного кода. 🔥
https://github.com/openjdk/jmh
👉@BookJava
Создайте класс бенчмарка для измерения производительности конкретного кода. 🔥
https://github.com/openjdk/jmh
👉@BookJava
Какой у Spring бинов скоуп по умолчанию?
В Spring Framework во всех определениях бизнес-сущностей (bean) явно или неявно присутствует атрибут scope. В Java-конфигурации он передается в аннотации
Атрибут scope – это строка-идентификатор, которая ставит бину в соответствие экземпляр класса
В простейшем Spring-приложении всегда существует два сокоупа:
• singleton – объект создается однажды, при последующих внедрениях переиспользуется. Полезен для большинства случаев: различные сервисы, объекты без состояния, неизменяемые объекты. Стоит заметить, это не класс-синглтон: при объявлении двух бинов одного класса их экземпляров будет два. Это скоуп по умолчанию.
• prototype – при каждом внедрении фабрика бинов создает новый объект. Нужен для изменяемых бинов с состоянием.
Spring Web добавляет 4 дополнительных скоупа, которые делают бин синглтоном в пределах обработки одного сетевого запроса (request), клиентской сессии (session), контекста сервлета (application) и вебсокет-сессии (websocket).
Разработчик может добавлять собственные скоупы. Пример реализации одного можно найти в самих исходниках Spring:
👉@BookJava
В Spring Framework во всех определениях бизнес-сущностей (bean) явно или неявно присутствует атрибут scope. В Java-конфигурации он передается в аннотации
@Scope
, в xml – в атрибуте scope
тега <bean>
.Атрибут scope – это строка-идентификатор, которая ставит бину в соответствие экземпляр класса
org.springframework.beans.factory.config.Scope
. Скоуп – реализация паттерна «стратегия» для фабрик бинов, инструкция по созданию бизнес-объектов.В простейшем Spring-приложении всегда существует два сокоупа:
• singleton – объект создается однажды, при последующих внедрениях переиспользуется. Полезен для большинства случаев: различные сервисы, объекты без состояния, неизменяемые объекты. Стоит заметить, это не класс-синглтон: при объявлении двух бинов одного класса их экземпляров будет два. Это скоуп по умолчанию.
• prototype – при каждом внедрении фабрика бинов создает новый объект. Нужен для изменяемых бинов с состоянием.
Spring Web добавляет 4 дополнительных скоупа, которые делают бин синглтоном в пределах обработки одного сетевого запроса (request), клиентской сессии (session), контекста сервлета (application) и вебсокет-сессии (websocket).
Разработчик может добавлять собственные скоупы. Пример реализации одного можно найти в самих исходниках Spring:
SimpleThreadScope
, который делает бин тред-локальным. Для использования его, как и пользовательские скоупы, нужно сначала зарегистрировать в BeanFactory
.👉@BookJava
Узнайте на открытом практическом уроке от OTUS, где вы:
— увидите, как создаются программы на Java с использованием Stream API;
— разберетесь, как легко перевести ваш старый код на Stream API;
— сможете попробовать создать похожие приложения и даже улучшить их.
Спикер Роман Вороновский — опытный разработчик и ментор.
Встречаемся 5 июня в 20:00 мск в рамках курса «Специализация Java-разработчик». Все участники вебинара получат специальную цену на обучение!
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Please open Telegram to view this post
VIEW IN TELEGRAM
Совет по Java 💡
Занимаетесь ли вы версионированием REST API в своих приложениях? Micronaut🚀 - единственный популярный фреймворк Java☕️, который предоставляет очень удобный встроенный механизм для этого 👆
#java #restapi #versioning #micronaut
👉@BookJava
Занимаетесь ли вы версионированием REST API в своих приложениях? Micronaut🚀 - единственный популярный фреймворк Java☕️, который предоставляет очень удобный встроенный механизм для этого 👆
#java #restapi #versioning #micronaut
👉@BookJava
Что происходит внутри HashMap.put()?
1. Вычисляется хэш ключа. Если ключ null, хэш считается равным 0. Чтобы достичь лучшего распределения, результат вызова hashCode() «перемешивается»: его старшие биты XOR-ятся на младшие.
2. Значения внутри хэш-таблицы хранятся в специальных структурах данных – нодах, в массиве. Из хэша высчитывается номер бакета – индекс для значения в этом массиве. Полученный хэш обрезается по текущей длине массива. Длина – всегда степень двойки, так что для скорости используется битовая операция &.
3. В бакете ищется нода. В ячейке массива лежит не просто одна нода, а связка всех нод, которые туда попали. Исполнение проходит по этой связке (цепочке или дереву), и ищет ноду с таким же ключом. Ключ сравнивается с имеющимися сначала на ==, затем на equals.
4. Если нода найдена – её значение просто заменяется новым. Работа метода на этом завершается.
5. Если ноды с таким же ключом в бакете пока нет – добавляемая пара ключ-значение запаковывается в новый объект типа Node, и прикрепляется к структуре существующих нод бакета. Ноды составляют структуру за счет того, что в ноде хранится ссылка на следующий элемент (для дерева – следующие элементы). Кроме самой пары и ссылок, чтобы потом не считать заново, записывается и хэш ключа.
6. В случае, когда структурой была цепочка а не дерево, и длина цепочки превысила 7 элементов – происходит процедура treeification – превращение списка в самобалансирующееся дерево. В случае коллизии это ускоряет доступ к элементам на чтение с O(n) до O(log(n)). У comparable-ключей для балансировки используется их естественный порядок. Другие ключи балансируются по порядку имен их классов и значениям identityHashCode-ов. Для маленьких хэш-таблиц (< 64 бакетов) «одеревенение» заменяется увеличением (см. п.8).
7. Если новая нода попала в пустую ячейку, заняла новый бакет – увеличивается счетчик структурных модификаций. Изменение этого счетчика сообщит всем итераторам контейнера, что при следующем обращении они должны выбросить ConcurrentModificationException.
8. Когда количество занятых бакетов массива превысило пороговое (capacity * load factor), внутренний массив увеличивается вдвое, а для всего содержимого выполняется рехэш – все имеющиеся ноды перераспределяются по бакетам по тем же правилам, но уже с учетом нового размера.
👉@BookJava
1. Вычисляется хэш ключа. Если ключ null, хэш считается равным 0. Чтобы достичь лучшего распределения, результат вызова hashCode() «перемешивается»: его старшие биты XOR-ятся на младшие.
2. Значения внутри хэш-таблицы хранятся в специальных структурах данных – нодах, в массиве. Из хэша высчитывается номер бакета – индекс для значения в этом массиве. Полученный хэш обрезается по текущей длине массива. Длина – всегда степень двойки, так что для скорости используется битовая операция &.
3. В бакете ищется нода. В ячейке массива лежит не просто одна нода, а связка всех нод, которые туда попали. Исполнение проходит по этой связке (цепочке или дереву), и ищет ноду с таким же ключом. Ключ сравнивается с имеющимися сначала на ==, затем на equals.
4. Если нода найдена – её значение просто заменяется новым. Работа метода на этом завершается.
5. Если ноды с таким же ключом в бакете пока нет – добавляемая пара ключ-значение запаковывается в новый объект типа Node, и прикрепляется к структуре существующих нод бакета. Ноды составляют структуру за счет того, что в ноде хранится ссылка на следующий элемент (для дерева – следующие элементы). Кроме самой пары и ссылок, чтобы потом не считать заново, записывается и хэш ключа.
6. В случае, когда структурой была цепочка а не дерево, и длина цепочки превысила 7 элементов – происходит процедура treeification – превращение списка в самобалансирующееся дерево. В случае коллизии это ускоряет доступ к элементам на чтение с O(n) до O(log(n)). У comparable-ключей для балансировки используется их естественный порядок. Другие ключи балансируются по порядку имен их классов и значениям identityHashCode-ов. Для маленьких хэш-таблиц (< 64 бакетов) «одеревенение» заменяется увеличением (см. п.8).
7. Если новая нода попала в пустую ячейку, заняла новый бакет – увеличивается счетчик структурных модификаций. Изменение этого счетчика сообщит всем итераторам контейнера, что при следующем обращении они должны выбросить ConcurrentModificationException.
8. Когда количество занятых бакетов массива превысило пороговое (capacity * load factor), внутренний массив увеличивается вдвое, а для всего содержимого выполняется рехэш – все имеющиеся ноды перераспределяются по бакетам по тем же правилам, но уже с учетом нового размера.
👉@BookJava
Узнайте на открытом практическом уроке «Применение batch-операций в Jdbc» от OTUS. Познакомимся с возможностями инструмента, ответим на все возникающие вопросы.
Спикер Сергей Петрелевич — опытный Java/Kotlin-разработчик, Oracle Certified Professional, Java SE 8 Programmer.
Встречаемся 11 июня в 20:00 мск в рамках курса «Java Developer. Professional».
Все участники вебинара получат специальную цену на обучение!
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Please open Telegram to view this post
VIEW IN TELEGRAM
Напоминание о необходимости переключить стартовую зависимость DGS на интеграцию DGS/Spring GraphQL.
Скоро это будет сделано по умолчанию, поэтому, пожалуйста, протестируйте свои приложения. Мы не заметили никаких проблем с переключением в Netflix 🙌.
https://netflix.github.io/dgs/spring-graphql-integration/
#Java #GraphQL #springboot
👉@BookJava
Скоро это будет сделано по умолчанию, поэтому, пожалуйста, протестируйте свои приложения. Мы не заметили никаких проблем с переключением в Netflix 🙌.
https://netflix.github.io/dgs/spring-graphql-integration/
#Java #GraphQL #springboot
👉@BookJava
Чем синхронный сервер отличается от асинхронного?
Вопрос может быть сформулирован как «сравните Jetty и Netty», или «зачем нужен Spring WebFlux».
Большинство современных Java web-серверов синхронные. Это значит, что для каждого пришедшего HTTP-запроса выделяется отдельный поток. Даже если такой поток переиспользуется с помощью пула, он остается занятым до конца обработка запроса.
Таким образом, если каждый запрос выполняется одну секунду, то при всего лишь 2000 запросов в секунду сервер расходует 2000 потоков. Потоки в ОС – ограниченный ресурс, и не важно как сконфигурирован ваш сервер – в какой-то момент производительность резко просядет.
Альтернативное решение – асинхронные сервера. В них для потоков обработки HTTP-запросов используется work stealing. В широком смысле, вызовы асинхронных функций не блокируют выполнение, а их результат вместо return value возвращается параметром коллбэка. В Java этот результат зачастую возвращается в виде объекта Future.
Чтобы вся обработка запроса стала действительно асинхронной, необходимо также избавиться от блокирующих операций. Иначе преимущество подхода с work stealing выродится в простой пул потоков. Блокирующая работа с файлами и сетью должна быть заменена на NIO, а для БД должен быть использован асинхронный драйвер.
👉@BookJava
Вопрос может быть сформулирован как «сравните Jetty и Netty», или «зачем нужен Spring WebFlux».
Большинство современных Java web-серверов синхронные. Это значит, что для каждого пришедшего HTTP-запроса выделяется отдельный поток. Даже если такой поток переиспользуется с помощью пула, он остается занятым до конца обработка запроса.
Таким образом, если каждый запрос выполняется одну секунду, то при всего лишь 2000 запросов в секунду сервер расходует 2000 потоков. Потоки в ОС – ограниченный ресурс, и не важно как сконфигурирован ваш сервер – в какой-то момент производительность резко просядет.
Альтернативное решение – асинхронные сервера. В них для потоков обработки HTTP-запросов используется work stealing. В широком смысле, вызовы асинхронных функций не блокируют выполнение, а их результат вместо return value возвращается параметром коллбэка. В Java этот результат зачастую возвращается в виде объекта Future.
Чтобы вся обработка запроса стала действительно асинхронной, необходимо также избавиться от блокирующих операций. Иначе преимущество подхода с work stealing выродится в простой пул потоков. Блокирующая работа с файлами и сетью должна быть заменена на NIO, а для БД должен быть использован асинхронный драйвер.
👉@BookJava
OpenAPI 3 и Spring-Boot 3 - что нового? Бадр Насс Лахсен @ Spring I/O 2024
https://www.youtube.com/watch?v=ondlnm5ZoFM
Slides: https://speakerdeck.com/bnasslahsen/openapi-3-dot-1-and-spring-boot-3-whats-new
👉@BookJava
https://www.youtube.com/watch?v=ondlnm5ZoFM
Slides: https://speakerdeck.com/bnasslahsen/openapi-3-dot-1-and-spring-boot-3-whats-new
👉@BookJava
YouTube
OpenAPI 3 and Spring-Boot 3 - What's new? by Badr Nass Lahsen @ Spring I/O 2024
Spring I/O 2024 - 30-31 May, Barcelona
Slides: https://speakerdeck.com/bnasslahsen/openapi-3-dot-1-and-spring-boot-3-whats-new
Repo: https://github.com/springdoc/springdoc-openapi-demos
APIs play a central role in the evolution of business IT. Adopting…
Slides: https://speakerdeck.com/bnasslahsen/openapi-3-dot-1-and-spring-boot-3-whats-new
Repo: https://github.com/springdoc/springdoc-openapi-demos
APIs play a central role in the evolution of business IT. Adopting…
🎯 Как джуну в Java-разработке миновать мучительные поиски хорошего оффера и залететь сразу на мидла?
Актуальное обучение для всех, кто хочет стать Java-разработчиком с нуля и для тех, кто еще не определился с языком программирования.
📌 После онлайн-курса «Специализация Java-разработчик» от OTUS вы сможете:
- создавать современные приложения на Java;
- работать с реляционными базами данных;
- разрабатывать серверные веб-приложения;
- претендовать на позиции Middle Java Developer.
Вы освоите самые востребованные инструменты и лучшие практики.
Забудьте о скучном обучении — здесь вас ждут настоящие челленджи и нестандартные практические решения. А еще сильные проекты для портфолио и карьерный сапорт!
Старт уже 28 июня.
👉 Изучите подробности и оставьте заявку, чтобы получить специальную цену на курс: https://vk.cc/cxqQ3u
Актуальное обучение для всех, кто хочет стать Java-разработчиком с нуля и для тех, кто еще не определился с языком программирования.
- создавать современные приложения на Java;
- работать с реляционными базами данных;
- разрабатывать серверные веб-приложения;
- претендовать на позиции Middle Java Developer.
Вы освоите самые востребованные инструменты и лучшие практики.
Забудьте о скучном обучении — здесь вас ждут настоящие челленджи и нестандартные практические решения. А еще сильные проекты для портфолио и карьерный сапорт!
Старт уже 28 июня.
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Please open Telegram to view this post
VIEW IN TELEGRAM
Совет по Java 💡
С помощью библиотеки Jinq (https://jinq.org) вы можете писать запросы к базам данных, используя потоки Java. Она обеспечивает стиль запросов, схожий с известной библиотекой .NET LINQ. Конечно, вы можете легко интегрировать Jinq с Spring Boot.
#java #jpa #streams
👉@BookJava
С помощью библиотеки Jinq (https://jinq.org) вы можете писать запросы к базам данных, используя потоки Java. Она обеспечивает стиль запросов, схожий с известной библиотекой .NET LINQ. Конечно, вы можете легко интегрировать Jinq с Spring Boot.
#java #jpa #streams
👉@BookJava
Совет по Java 💡
Хотите создавать JPA-запросы с помощью стандартных потоков Java? Вы можете использовать библиотеку JPAstreamer (https://jpastreamer.org). Она может быть интегрирована, например, в Spring Boot.
#jpa #java #streams #hibernate
👉@BookJava
Хотите создавать JPA-запросы с помощью стандартных потоков Java? Вы можете использовать библиотеку JPAstreamer (https://jpastreamer.org). Она может быть интегрирована, например, в Spring Boot.
#jpa #java #streams #hibernate
👉@BookJava
Подборка Telegram каналов для программистов
Системное администрирование 📌
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 и др.
https://t.me/sysadminoff Новости Линукс Linux
https://t.me/tikon_1 Новости высоких технологий, науки и техники💡
https://t.me/mir_teh Мир технологий (Technology World)
https://t.me/rust_lib Полезный контент по программированию на Rust
https://t.me/golang_lib Библиотека Go (Golang) разработчика
https://t.me/itmozg Программисты, дизайнеры, новости из мира IT.
https://t.me/phis_mat Обучающие видео, книги по Физике и Математике
https://t.me/php_lib Библиотека PHP программиста 👨🏼💻👩💻
https://t.me/nodejs_lib Подборки по Node js и все что с ним связано
https://t.me/ruby_lib Библиотека Ruby программиста
1C разработка 📌
https://t.me/odin1C_rus Cтатьи, курсы, советы, шаблоны кода 1С
Программирование C++📌
https://t.me/cpp_lib Библиотека C/C++ разработчика
https://t.me/cpp_knigi Книги для программистов C/C++
https://t.me/cpp_geek Учим C/C++ на примерах
Программирование Python 📌
https://t.me/pythonofff Python академия. Учи Python быстро и легко🐍
https://t.me/BookPython Библиотека Python разработчика
https://t.me/python_real Python подборки на русском и английском
https://t.me/python_360 Книги по Python Rus
Java разработка 📌
https://t.me/BookJava Библиотека Java разработчика
https://t.me/java_360 Книги по Java Rus
https://t.me/java_geek Учим Java на примерах
GitHub Сообщество 📌
https://t.me/Githublib Интересное из GitHub
Базы данных (Data Base) 📌
https://t.me/database_info Все про базы данных
Мобильная разработка: iOS, Android 📌
https://t.me/developer_mobila Мобильная разработка
https://t.me/kotlin_lib Подборки полезного материала по Kotlin
Фронтенд разработка 📌
https://t.me/frontend_1 Подборки для frontend разработчиков
https://t.me/frontend_sovet Frontend советы, примеры и практика!
https://t.me/React_lib Подборки по React js и все что с ним связано
Разработка игр 📌
https://t.me/game_devv Все о разработке игр
Вакансии 📌
https://t.me/sysadmin_rabota Системный Администратор
https://t.me/progjob Вакансии в IT
Чат программистов📌
https://t.me/developers_ru
Библиотеки 📌
https://t.me/book_for_dev Книги для программистов Rus
https://t.me/programmist_of Книги по программированию
https://t.me/proglb Библиотека программиста
https://t.me/bfbook Книги для программистов
https://t.me/books_reserv Книги для программистов
БигДата, машинное обучение 📌
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/xakep_1 Статьи из "Хакера"
Книги, статьи для дизайнеров 📌
https://t.me/ux_web Статьи, книги для дизайнеров
Английский 📌
https://t.me/UchuEnglish Английский с нуля
Математика 📌
https://t.me/Pomatematike Канал по математике
Excel лайфхак📌
https://t.me/Excel_lifehack
Системное администрирование 📌
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 и др.
https://t.me/sysadminoff Новости Линукс Linux
https://t.me/tikon_1 Новости высоких технологий, науки и техники💡
https://t.me/mir_teh Мир технологий (Technology World)
https://t.me/rust_lib Полезный контент по программированию на Rust
https://t.me/golang_lib Библиотека Go (Golang) разработчика
https://t.me/itmozg Программисты, дизайнеры, новости из мира IT.
https://t.me/phis_mat Обучающие видео, книги по Физике и Математике
https://t.me/php_lib Библиотека PHP программиста 👨🏼💻👩💻
https://t.me/nodejs_lib Подборки по Node js и все что с ним связано
https://t.me/ruby_lib Библиотека Ruby программиста
1C разработка 📌
https://t.me/odin1C_rus Cтатьи, курсы, советы, шаблоны кода 1С
Программирование C++📌
https://t.me/cpp_lib Библиотека C/C++ разработчика
https://t.me/cpp_knigi Книги для программистов C/C++
https://t.me/cpp_geek Учим C/C++ на примерах
Программирование Python 📌
https://t.me/pythonofff Python академия. Учи Python быстро и легко🐍
https://t.me/BookPython Библиотека Python разработчика
https://t.me/python_real Python подборки на русском и английском
https://t.me/python_360 Книги по Python Rus
Java разработка 📌
https://t.me/BookJava Библиотека Java разработчика
https://t.me/java_360 Книги по Java Rus
https://t.me/java_geek Учим Java на примерах
GitHub Сообщество 📌
https://t.me/Githublib Интересное из GitHub
Базы данных (Data Base) 📌
https://t.me/database_info Все про базы данных
Мобильная разработка: iOS, Android 📌
https://t.me/developer_mobila Мобильная разработка
https://t.me/kotlin_lib Подборки полезного материала по Kotlin
Фронтенд разработка 📌
https://t.me/frontend_1 Подборки для frontend разработчиков
https://t.me/frontend_sovet Frontend советы, примеры и практика!
https://t.me/React_lib Подборки по React js и все что с ним связано
Разработка игр 📌
https://t.me/game_devv Все о разработке игр
Вакансии 📌
https://t.me/sysadmin_rabota Системный Администратор
https://t.me/progjob Вакансии в IT
Чат программистов📌
https://t.me/developers_ru
Библиотеки 📌
https://t.me/book_for_dev Книги для программистов Rus
https://t.me/programmist_of Книги по программированию
https://t.me/proglb Библиотека программиста
https://t.me/bfbook Книги для программистов
https://t.me/books_reserv Книги для программистов
БигДата, машинное обучение 📌
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/xakep_1 Статьи из "Хакера"
Книги, статьи для дизайнеров 📌
https://t.me/ux_web Статьи, книги для дизайнеров
Английский 📌
https://t.me/UchuEnglish Английский с нуля
Математика 📌
https://t.me/Pomatematike Канал по математике
Excel лайфхак📌
https://t.me/Excel_lifehack
Collection.removeIf
Метод перебирает коллекцию, и удаляет те элементы, которые соответствуют
В нашем примере мы в одну строку удаляем из списка все числа больше 5.
👉@BookJava
Метод перебирает коллекцию, и удаляет те элементы, которые соответствуют
filter
.В нашем примере мы в одну строку удаляем из списка все числа больше 5.
👉@BookJava
В чем разница между JavaEE, JavaSE и JavaME?
Как язык программирования, в рамках одной версии Java везде приблизительно одинаковая. С точки зрения платформы, существуют разные вариации:
• Standard Edition (SE) – основной набор.
• Enterprise Edition (EE) – стандартная версия, с дополнительными интерфейсами корпоративных web-технологий.
• Micro Edition (ME) – для платформ, сильно ограниченных в ресурсах. Интернет вещей, Raspberry PI, умные телевизоры. Если помните, игры для старых телефонов имели расширение .jar.
• Java Card – джава для банковских и SIM-карт. Подмножество основного языка, с урезанной библиотекой, измененным байткодом, и упором на безопасность. Когда в окне инсталлятора баннер заявляет «3 Billion Devices Run Java», в счёт идут и карточки.
• JavaFX – платформа для десктопных приложений, замена Swing. Сейчас живет как отдельный opensource-проект.
👉@BookJava
Как язык программирования, в рамках одной версии Java везде приблизительно одинаковая. С точки зрения платформы, существуют разные вариации:
• Standard Edition (SE) – основной набор.
• Enterprise Edition (EE) – стандартная версия, с дополнительными интерфейсами корпоративных web-технологий.
• Micro Edition (ME) – для платформ, сильно ограниченных в ресурсах. Интернет вещей, Raspberry PI, умные телевизоры. Если помните, игры для старых телефонов имели расширение .jar.
• Java Card – джава для банковских и SIM-карт. Подмножество основного языка, с урезанной библиотекой, измененным байткодом, и упором на безопасность. Когда в окне инсталлятора баннер заявляет «3 Billion Devices Run Java», в счёт идут и карточки.
• JavaFX – платформа для десктопных приложений, замена Swing. Сейчас живет как отдельный opensource-проект.
👉@BookJava
Пройди тест по Java и проверь свои знания, готов ли ты к обучению на курсе.
Ответишь — пройдешь на продвинутый курс "Java Developer. Professional" от OTUS по специальной цене + получишь доступ к записям открытых уроков курса курса
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Please open Telegram to view this post
VIEW IN TELEGRAM
🚀 Протестируйте приложение с помощью Taikai
Taikai - это мощное расширение популярной библиотеки
https://github.com/enofex/taikai
👉@BookJava
Taikai - это мощное расширение популярной библиотеки
ArchUnit
, предлагающее полный набор предопределенных правил, адаптированных для различных технологий. 🔥https://github.com/enofex/taikai
👉@BookJava
Где у Java приложения точка входа?
В обычном Java приложении всегда должен быть
main обязательно
В главном методе должен быть объявлен единственный аргумент – массив строк. Обе конструкции
Когда приложение запускается как
Для исполняемого jar-файла (java -jar MyJar.jar), его главный класс должен быть указан в манифесте. Внутри архива, в файл
В случае, когда в указанном главном классе не оказывается метода, который бы удовлетворял всем критериям главного метода, программа падает с ошибкой «Main method not found».
В апплетах вместо main входной точкой служат методы
👉@BookJava
В обычном Java приложении всегда должен быть
main class
, содержащий метод main
. С него начинается исполнение всей программы. Main class
-ом может быть не только класс, но и интерфейс или енам. Для JavaFX приложения главный класс должен реализовывать javafx.application.Application
.main обязательно
public static
. Дополнительно, методу разрешено иметь модификатор strictfp. На аннотации и список исключений ограничений не накладывается.В главном методе должен быть объявлен единственный аргумент – массив строк. Обе конструкции
String[]
и String
... компилируются в один и тот же байт-код, так что приемлемы оба варианта. Название массива может быть любым, а значение будет содержать аргументы командной строки.Когда приложение запускается как
classpath
, главный класс передается параметром командной строки. Если выполняется единственный исходник, он и описывает main class
.Для исполняемого jar-файла (java -jar MyJar.jar), его главный класс должен быть указан в манифесте. Внутри архива, в файл
META-INF/MANIFEST.MF
добавляется строчка вида Main-Class: ru.google.com.MyClass
. Иначе запуск завершается ошибкой «no main manifest attribute
».В случае, когда в указанном главном классе не оказывается метода, который бы удовлетворял всем критериям главного метода, программа падает с ошибкой «Main method not found».
В апплетах вместо main входной точкой служат методы
init
и start
. Начиная с версии Java 9 технология апплетов объявлена устаревшей, а с 11 – совсем удалена. Не будем останавливаться на них подробнее.👉@BookJava
Ждём вас на открытом практическом уроке «Сборка приложения на Java» от OTUS, где мы:
- рассмотрим, как запустить и собрать исполняемый jar-файл;
- добавим в него ресурсы;
- запустим Java-приложение;
- научимся использовать утилиты javac и java, jvm, jre, jdk и classpath.
Спикер Андрей Поляков — старший разработчик в международной финтех-компании.
Встречаемся 18 июня в 20:00 мск в рамках курса «Специализация Java-разработчик».
Все участники вебинара получат специальную цену на обучение!
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Please open Telegram to view this post
VIEW IN TELEGRAM
Hibernate и спецификация JPA: приключение на 20 минут
На прошлой неделе в блоге сообщества Spring АйО вышла статья-перевод про интересный кейс падения производительности при переходе на Hibernate 6.5. Оказалось, что выражения вида publisherId in :ids при пустом ids приводит к серьезной деградации производительности. Баг вскоре был пофикшен, однако, не дает покоя вопрос, почему так произошло?
Ниже приводим историю появления и незамедлительного решения этой проблемы, от лица Гэвина Кинга, создателя Hibernate.
https://habr.com/ru/companies/spring_aio/articles/821307/
👉@BookJava
На прошлой неделе в блоге сообщества Spring АйО вышла статья-перевод про интересный кейс падения производительности при переходе на Hibernate 6.5. Оказалось, что выражения вида publisherId in :ids при пустом ids приводит к серьезной деградации производительности. Баг вскоре был пофикшен, однако, не дает покоя вопрос, почему так произошло?
Ниже приводим историю появления и незамедлительного решения этой проблемы, от лица Гэвина Кинга, создателя Hibernate.
https://habr.com/ru/companies/spring_aio/articles/821307/
👉@BookJava
🚀 Простой сервис HTTP-запросов и ответов 🚀
Очень хорошо подходит для тестирования ваших http-запросов! 🔥
https://httpbin.org/#/Response_inspection
👉@BookJava
Очень хорошо подходит для тестирования ваших http-запросов! 🔥
https://httpbin.org/#/Response_inspection
👉@BookJava