Совет по SpringFramework 💡
Самый простой способ создания динамических SQL-запросов в JPA - это Query By Example. Вы создаете объект-пример, который оборачиваете в пример, а затем передаете его в ваш
хранилищу. JPA создаст WHERE только с теми полями, которые вы задали.
👉 @BookJava
Самый простой способ создания динамических SQL-запросов в JPA - это Query By Example. Вы создаете объект-пример, который оборачиваете в пример, а затем передаете его в ваш
@SpringData
хранилищу. JPA создаст WHERE только с теми полями, которые вы задали.
👉 @BookJava
👍7💩4
Как нельзя называть переменные?
Этот вопрос подразумевает ответ из двух частей. Нужно указать, какие есть технические ограничения, и какие стилистические. Стиль – слишком большая тема, не специфичная только для Java, не будем на ней останавливаться.
Технически компилятор налагает одинаковые ограничения на имена как переменных, так и классов, методов, и всего остального. Эти имена обобщенно называются идентификаторы.
Ограничений всего три:
1. Имя целиком не должно совпадать с зарезервированным словом;
2. Первый символ должен проходить проверку методом Character.isJavaIdentifierStart();
3. Остальные символы должны проходить проверку Character.isJavaIdentifierPart().
На практике проверки означают, что имя должно состоять из таких символов Unicode, как:
• Буквы (разных языков)
• Символы валют (такие как $)
• Соединительные символы (такие как _)
• Диакритика (combining mark, non-spacing mark)
• Методы, проходящие Character.isIdentifierIgnorable() (непечатаемые символы, в идентификаторе игнорируются компилятором)
• Цифры, числовые символы (такие как римские числа)
Последний пункт недопустим для первого символа имени. Тип конкретного символа можно узнать методом Character.getType().
Интересно зарезервированное слово var. Оно стоит особняком от других ключевых слов, потому что является зарезервированным только в контексте типа. Использовать var в качестве имени переменной можно.
👉@BookJava
Этот вопрос подразумевает ответ из двух частей. Нужно указать, какие есть технические ограничения, и какие стилистические. Стиль – слишком большая тема, не специфичная только для Java, не будем на ней останавливаться.
Технически компилятор налагает одинаковые ограничения на имена как переменных, так и классов, методов, и всего остального. Эти имена обобщенно называются идентификаторы.
Ограничений всего три:
1. Имя целиком не должно совпадать с зарезервированным словом;
2. Первый символ должен проходить проверку методом Character.isJavaIdentifierStart();
3. Остальные символы должны проходить проверку Character.isJavaIdentifierPart().
На практике проверки означают, что имя должно состоять из таких символов Unicode, как:
• Буквы (разных языков)
• Символы валют (такие как $)
• Соединительные символы (такие как _)
• Диакритика (combining mark, non-spacing mark)
• Методы, проходящие Character.isIdentifierIgnorable() (непечатаемые символы, в идентификаторе игнорируются компилятором)
• Цифры, числовые символы (такие как римские числа)
Последний пункт недопустим для первого символа имени. Тип конкретного символа можно узнать методом Character.getType().
Интересно зарезервированное слово var. Оно стоит особняком от других ключевых слов, потому что является зарезервированным только в контексте типа. Использовать var в качестве имени переменной можно.
👉@BookJava
👍5
Slim Docker Images для Java
Из этой статьи вы узнаете, как создавать слим Docker-образы для ваших Java-приложений с помощью Alpine Linux и Jlink.
https://piotrminkowski.com/2023/11/07/slim-docker-images-for-java/
👉@BookJava
Из этой статьи вы узнаете, как создавать слим Docker-образы для ваших Java-приложений с помощью Alpine Linux и Jlink.
https://piotrminkowski.com/2023/11/07/slim-docker-images-for-java/
👉@BookJava
👍4
Что такое механизм try-with-resources?
Данная конструкция, которая появилась в Java 7, позволяет использовать блок try-catch не заботясь о закрытии ресурсов, используемых в данном сегменте кода. Ресурсы объявляются в скобках сразу после try, а компилятор уже сам неявно создаёт секцию finally, в которой и происходит освобождение занятых в блоке ресурсов. Под ресурсами подразумеваются сущности, реализующие интерфейс java.lang.Autocloseable.
Стоит заметить, что блоки catch и явный finally выполняются уже после того, как закрываются ресурсы в неявном finally.
👉@BookJava
Данная конструкция, которая появилась в Java 7, позволяет использовать блок try-catch не заботясь о закрытии ресурсов, используемых в данном сегменте кода. Ресурсы объявляются в скобках сразу после try, а компилятор уже сам неявно создаёт секцию finally, в которой и происходит освобождение занятых в блоке ресурсов. Под ресурсами подразумеваются сущности, реализующие интерфейс java.lang.Autocloseable.
Стоит заметить, что блоки catch и явный finally выполняются уже после того, как закрываются ресурсы в неявном finally.
👉@BookJava
👍7🔥2
Советы по Java API 🚀
Синхронизация в Java - ReentrantLock
Усовершенствуйте синхронизацию потоков с помощью ReentrantLock в Java. Достигайте более тонкого контроля и продвинутых механизмов блокировки.
https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/util/concurrent/locks/ReentrantLock.html
👉@BookJava
Синхронизация в Java - ReentrantLock
Усовершенствуйте синхронизацию потоков с помощью ReentrantLock в Java. Достигайте более тонкого контроля и продвинутых механизмов блокировки.
class X {
private final ReentrantLock lock = new ReentrantLock();
// ...
public void m() {
lock.lock(); // block until condition holds
try {
// ... method body
} finally {
lock.unlock();
}
}
}
https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/util/concurrent/locks/ReentrantLock.html
👉@BookJava
👍4👎1
Особенности работы класса Matcher
Как мы уже писали ранее, основная функциональность работы с регулярными выражениями представлена в Java классом
Во-первых, в общем случае матчер действует не по всей строке, а только внутри заданного «региона». Изначально регион совпадает со всей строкой, но его можно сужать и изменять в процессе работы. Методы
Свойство
Регулярные выражения используются для двух задач: поиска и замены. Поговорим о поиске.
Метод
Интерфейс
Есть еще пара свойств последнего поиска, которые актуальны не только для успешного результата, поэтому не вошли в интерфейс:
Метод
Для замены совпавших с регулярным выражением подстрок есть методы
При замене можно использовать
Есть более гибкий способ замены.
👉@BookJava
Как мы уже писали ранее, основная функциональность работы с регулярными выражениями представлена в Java классом
Matcher
. Рассмотрим его подробнее.Во-первых, в общем случае матчер действует не по всей строке, а только внутри заданного «региона». Изначально регион совпадает со всей строкой, но его можно сужать и изменять в процессе работы. Методы
regionStart
и regionEnd
возвращают текущие границы, а region
устанавливает новые.Свойство
transparentBounds
экземпляра матчера может разрешать регулярному выражению заглядывать при поиске за границы, при условии что итоговая совпавшая подстрока будет всё ещё в границах региона (lookahead
и lookbehind
). А выключив свойство anchoringBounds
можно перестать трактовать границы региона как границы строки (^ и $ в выражении).Регулярные выражения используются для двух задач: поиска и замены. Поговорим о поиске.
Метод
matches
проверяет, удовлетворяет ли выражению весь регион, lookingAt
– хотя бы его начало. Метод find
похож на next
итератора – он последовательно идет по строке, и находит следующие совпадения с выражением. Эту итерацию можно сдвинуть на определенную позицию строки, передав позицию как параметр.Matcher
реализует интерфейс MatchResult
. Через него предоставляется информация о последнем успешном поиске (любым из перечисленных методов). Если эту информацию необходимо сохранить, toMatchResult()
выделит её в отдельный иммутабельный объект. А если хочется обработать последовательность всех совпадений в виде стрима, поможет метод results()
.Интерфейс
MatchReslut
предоставляет методы group
, start
и end
. Они дают содержимое найденной подстроки и ее позицию в строке. Если этим методам параметром передать номер или имя группы, то результатом будет информация не о всей подстроке, а о ее группах. Общее количество групп хранится в свойстве groupCount
.Есть еще пара свойств последнего поиска, которые актуальны не только для успешного результата, поэтому не вошли в интерфейс:
hitEnd
и requireEnd
. hitEnd
сообщает, пришлось ли при последнем поиске дойти до конца региона. requireEnd
подскажет, мог ли измениться результат (успех/неудача) последнего поиска, если бы в конец региона был добавлен хвост.Метод
reset
сбрасывает всё это текущее состояние поиска. Передав в него параметр, можно заодно заменить строку, с которой работаем. Используемое регулярное выражение тоже можно заменить, методом usePattern
, но состояние поиска при этом не сбросится.Для замены совпавших с регулярным выражением подстрок есть методы
replaceFirst
и replaceAll
. В них можно передать как строку-замену, так и коллбэк, который будет вычислять её на лету. Оба метода сбрасывают состояние.При замене можно использовать
$
для ссылки на группы совпадения, а символ \
используется для escape
-последовательностей. Если требуется воспринимать эти символы без дополнительного смысла, необходимо обернуть строку-замену в вызов quoteReplacement
.Есть более гибкий способ замены.
Matcher
позволяет последовательно вручную выполнять поиск (всё теми же методами), а затем добавлять пройденный кусок строки с замененным совпадением в StringBuilder/StringBuffer
методом appendReplacement
. Оставшийся непройденный хвост добавляется методом appendTail
. То есть, последовательность вызовов m.find()
; m.appendReplacement()
; m.appendTail()
; эквивалентна вызову m.replaceFirst()
, а while(m.find()) m.appendReplacement()
; m.appendTail()
; – это m.replaceAll()
.👉@BookJava
👍8👏2❤1
🚀Совет Spring
Утилитный класс для сравнения объектов на основе их аннотаций
https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/core/annotation/AnnotationAwareOrderComparator.html
👉@BookJava
AnnotationAwareOrderComparator
Утилитный класс для сравнения объектов на основе их аннотаций
@Order
или Ordered
. Он используется в ситуациях, когда нужно определить порядок выполнения компонентов. 🔥https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/core/annotation/AnnotationAwareOrderComparator.html
👉@BookJava
👍6
Что можно делать с классом Connection?
Итак, в результате соединения JDBC драйвера создается объект Connection – сессия работы с базой данных. Это главный класс при работе с JDBC. Основная роль этого класса – исполнение SQL-выражений (Statement) и получение их результатов в виде ResultSet.
Connection предоставляет в виде класса DatabaseMetaData мета-информацию о базе данных в целом: таблицы, поддерживаемая грамматика SQL, хранимые процедуры, возможности этого соединения, и т.д..
В коннекшне задается множество настройки самого соединения. Это уровень изоляции транзакций, режим авто-коммита, ключи шардирования, и многое другое. Маппинг типов данных SQL в Java-типы задается здесь же, свойством typeMap.
Помимо выполнения выражений, Connection предоставляет средства для управления транзакциями. Его методами можно создать Savepoint, откатиться к нему, закоммитить транзакцию когда авто-коммит отключен.
#SQL
👉@BookJava
Итак, в результате соединения JDBC драйвера создается объект Connection – сессия работы с базой данных. Это главный класс при работе с JDBC. Основная роль этого класса – исполнение SQL-выражений (Statement) и получение их результатов в виде ResultSet.
Connection предоставляет в виде класса DatabaseMetaData мета-информацию о базе данных в целом: таблицы, поддерживаемая грамматика SQL, хранимые процедуры, возможности этого соединения, и т.д..
В коннекшне задается множество настройки самого соединения. Это уровень изоляции транзакций, режим авто-коммита, ключи шардирования, и многое другое. Маппинг типов данных SQL в Java-типы задается здесь же, свойством typeMap.
Помимо выполнения выражений, Connection предоставляет средства для управления транзакциями. Его методами можно создать Savepoint, откатиться к нему, закоммитить транзакцию когда авто-коммит отключен.
#SQL
👉@BookJava
👍6🎉3
Совет по JUnit 5 🚀
Тестируйте методы-шаблоны с помощью
Используйте
https://junit.org/junit5/docs/current/api/org.junit.jupiter.api/org/junit/jupiter/api/TestTemplate.html
👉@BookJava
Тестируйте методы-шаблоны с помощью
@TestTemplate
Используйте
@TestTemplate
для определения методов-шаблонов, которые создают динамические тесты на основе входных данных. 🔥https://junit.org/junit5/docs/current/api/org.junit.jupiter.api/org/junit/jupiter/api/TestTemplate.html
👉@BookJava
junit.org
TestTemplate (JUnit 5.12.0 API)
declaration: module: org.junit.jupiter.api, package: org.junit.jupiter.api, annotation type: TestTemplate
👍3
JRE – Java Runtime Environment, Java-окружение времени выполнения. Это набор всего необходимого чтобы запустить скомпилированную Java-программу. Окружение состоит из виртуальной машины Java (JVM), библиотеки классов (Java Class Library), консольной команды java и прочей инфраструктуры. Тем не менее, JRE не достаточно чтобы создавать новые программы.
JDK – Java Development Kit, набор Java-разработчика. Это полнофункциональный SDK для Java. JDK включает в себя JRE, но кроме того содержит компилятор (javac) и другие инструменты разработки, такие как javadoc и jdb. С помощью JDK можно создавать и компилировать программы.
В большинстве случаев, если вам нужно только запускать Java программы, вы устанавливаете только JRE, если же вы планируете программировать на Java, вместо этого вам необходим JDK.
https://stackoverflow.com/questions/1906445/what-is-the-difference-between-jdk-and-jre/1906455#1906455
👉@BookJava
JDK – Java Development Kit, набор Java-разработчика. Это полнофункциональный SDK для Java. JDK включает в себя JRE, но кроме того содержит компилятор (javac) и другие инструменты разработки, такие как javadoc и jdb. С помощью JDK можно создавать и компилировать программы.
В большинстве случаев, если вам нужно только запускать Java программы, вы устанавливаете только JRE, если же вы планируете программировать на Java, вместо этого вам необходим JDK.
https://stackoverflow.com/questions/1906445/what-is-the-difference-between-jdk-and-jre/1906455#1906455
👉@BookJava
👍7
Совет
Если вы случайно уже используете генератор метамодели в своем проекте, вы можете использовать сгенерированные классы модели в атрибуте
👉@BookJava
Если вы случайно уже используете генератор метамодели в своем проекте, вы можете использовать сгенерированные классы модели в атрибуте
mappedBy
ваших отношений, чтобы обеспечить немного большую типобезопасность.👉@BookJava
👍6🎉2🤓1
Тестовое собеседование на Middle Java-разработчика завтра
Завтра, 28 августа в 19:00 по мск приходи онлайн на открытое собеседование, чтобы посмотреть на настоящее интервью на Middle Java-разработчика.
Как это будет:
1. Роман Половинцев, ex-TeamLed в Сбер, Т-Банк, Райффайзенбанк и ВТБ позадает реальные вопросы и задачи разработчику-добровольцу
2. Роман будет комментировать каждый ответ респондента, чтобы дать понять чего от вас ожидает собеседующий на интервью
3. В конце можно будет задать любой вопрос Роману
Что узнаешь на прямом эфире от ШОРТКАТ:
- Чего ждут от кандидатов на Middle позиции в Java-разработке
- Какие вопросы задают на интервью и зачем
- Как подготовиться к собесу, чтобы получить оффер
Это бесплатно?
Бесплатно
Переходи в нашего бота, чтобы получить ссылку на эфир → @shortcut_sh_bot
Завтра, 28 августа в 19:00 по мск приходи онлайн на открытое собеседование, чтобы посмотреть на настоящее интервью на Middle Java-разработчика.
Как это будет:
1. Роман Половинцев, ex-TeamLed в Сбер, Т-Банк, Райффайзенбанк и ВТБ позадает реальные вопросы и задачи разработчику-добровольцу
2. Роман будет комментировать каждый ответ респондента, чтобы дать понять чего от вас ожидает собеседующий на интервью
3. В конце можно будет задать любой вопрос Роману
Что узнаешь на прямом эфире от ШОРТКАТ:
- Чего ждут от кандидатов на Middle позиции в Java-разработке
- Какие вопросы задают на интервью и зачем
- Как подготовиться к собесу, чтобы получить оффер
Это бесплатно?
Бесплатно
Переходи в нашего бота, чтобы получить ссылку на эфир → @shortcut_sh_bot
👍1
Media is too big
VIEW IN TELEGRAM
Java Virtual Threads
0:00 Intro
0:42 What are preview features, and how you can use them
3:34 What are Virtual Threads about?
4:21 Goals of Virtual Threads
5:11 Cost of a platform thread and CPU usage
7:49 How to use Virtual Threads
9:11 Using ExecutorServices with Virtual Threads
11:04 ThreadLocals and Synchronization
11:19 Synchronization, pinned threads and locks
13:14 Final words and outro
👉@BookJava
0:00 Intro
0:42 What are preview features, and how you can use them
3:34 What are Virtual Threads about?
4:21 Goals of Virtual Threads
5:11 Cost of a platform thread and CPU usage
7:49 How to use Virtual Threads
9:11 Using ExecutorServices with Virtual Threads
11:04 ThreadLocals and Synchronization
11:19 Synchronization, pinned threads and locks
13:14 Final words and outro
👉@BookJava
👍3
Media is too big
VIEW IN TELEGRAM
🎥 Java для начинающих | Уроки Java
#1 - Программирование на Java
#2 - Установка Java JDK и IntelliJ IDEA
#3 - Типы данных
#4 - Переменные
#5 - Арифметические операции
#6 - Условные операторы
#7 - циклы for, wile, do wile
#8 - Массивы в Java
#9 - Классы в Java
#10 - Тип данных String в Java
#11 - Наследование в Java
#12 - Java интерфейсы
#13 - Абстрактные классы java
#14 - Вложенные классы java
#15 - Пакеты в java
#16 - Перегрузка методов java
#17 - Основы ООП
#18 - Обработка исключений в java , try catch java / Java с нуля
Все видео доступны на youtube
👉@BookJava
#1 - Программирование на Java
#2 - Установка Java JDK и IntelliJ IDEA
#3 - Типы данных
#4 - Переменные
#5 - Арифметические операции
#6 - Условные операторы
#7 - циклы for, wile, do wile
#8 - Массивы в Java
#9 - Классы в Java
#10 - Тип данных String в Java
#11 - Наследование в Java
#12 - Java интерфейсы
#13 - Абстрактные классы java
#14 - Вложенные классы java
#15 - Пакеты в java
#16 - Перегрузка методов java
#17 - Основы ООП
#18 - Обработка исключений в java , try catch java / Java с нуля
Все видео доступны на youtube
👉@BookJava
👍3
Структурированное логирование в Spring Boot 3.4 🚀
В Spring Boot 3.4 поддержка структурированного логирования доступна из коробки. Поддерживаются форматы Elastic Common Schema (ECS) и Logstash. 🔥
https://spring.io/blog/2024/08/23/structured-logging-in-spring-boot-3-4
👉@BookJava
В Spring Boot 3.4 поддержка структурированного логирования доступна из коробки. Поддерживаются форматы Elastic Common Schema (ECS) и Logstash. 🔥
https://spring.io/blog/2024/08/23/structured-logging-in-spring-boot-3-4
👉@BookJava
Structured logging in Spring Boot 3.4
Level up your Java code and explore what Spring can do for you.
👍6
Совет по Spring 🚀
Используйте
👉@BookJava
Используйте
SSEEvent
в Spring для бесшовных обновлений в реальном времени в ваших приложениях 🔥👉@BookJava
👍3
Media is too big
VIEW IN TELEGRAM
🚀 Совет по Spring 🚀
Тестовые библиотеки Spring Boot (Testjars) 🔥
Привет, поклонники Spring! В этом выпуске мы рассмотрим новый проект Spring Boot Testjars, который значительно упрощает создание и повторное использование вспомогательных сервисов на базе Java, таких как микросервисы на основе Spring Boot или инфраструктурные компоненты, например, Spring Authorization Server.
источник
👉@BookJava
Тестовые библиотеки Spring Boot (Testjars) 🔥
Привет, поклонники Spring! В этом выпуске мы рассмотрим новый проект Spring Boot Testjars, который значительно упрощает создание и повторное использование вспомогательных сервисов на базе Java, таких как микросервисы на основе Spring Boot или инфраструктурные компоненты, например, Spring Authorization Server.
источник
👉@BookJava
👍5
Дилемма 3n+1 на Java. Кэшируем рекурсию
Приветствую всех, сегодня я хочу рассказать про одну из самых интересных неразгаданных загадок математики. Гипотеза Коллатца, или же дилемма 3n+1 прославилась благодаря простоте своей формулировки, при этом оставаясь не доказанной уже более 90 лет.
В этом выпуске : обзор самой гипотезы, код-снипеты, кэширование, рекурсия, и много чего еще.
Поехали.
Краткая формулировка, то бишь немного измененная выдержка из википедии Collatz conjecture — Wikipedia Гипотеза Коллатца — Википедия (wikipedia.org):
Берём любое натуральное число n:
1) Если оно чётное, то делим его на 2,
2) Если нечётное, то умножаем на 3 и прибавляем 1.
Над полученным числом выполняем те же самые действия, и так далее.
https://habr.com/ru/articles/839352/
👉@BookJava
Приветствую всех, сегодня я хочу рассказать про одну из самых интересных неразгаданных загадок математики. Гипотеза Коллатца, или же дилемма 3n+1 прославилась благодаря простоте своей формулировки, при этом оставаясь не доказанной уже более 90 лет.
В этом выпуске : обзор самой гипотезы, код-снипеты, кэширование, рекурсия, и много чего еще.
Поехали.
Краткая формулировка, то бишь немного измененная выдержка из википедии Collatz conjecture — Wikipedia Гипотеза Коллатца — Википедия (wikipedia.org):
Берём любое натуральное число n:
1) Если оно чётное, то делим его на 2,
2) Если нечётное, то умножаем на 3 и прибавляем 1.
Над полученным числом выполняем те же самые действия, и так далее.
https://habr.com/ru/articles/839352/
👉@BookJava
👍1
Media is too big
VIEW IN TELEGRAM
Когда ломается магия фреймворков...
Более чем за десять лет работы со Spring Framework и Enterprise Java я успел полюбить Spring Framework, возненавидеть и в итоге пересмотреть свои подходы к работе с ним. То же самое касается работы с рефлексией в целом и работы с АОП в частности.
источник
👉@BookJava
Более чем за десять лет работы со Spring Framework и Enterprise Java я успел полюбить Spring Framework, возненавидеть и в итоге пересмотреть свои подходы к работе с ним. То же самое касается работы с рефлексией в целом и работы с АОП в частности.
источник
👉@BookJava
👍2
Профилирование Java-приложений: от HeapDump до Grafana
Добрый день дорогой читатель. Сегодня я дам тебе несколько советов для поиска и анализа проблем в твоем Java приложении. Мы разберем такие вещи как: HeapDump, ThreadDump, VisualVM, Grafana, HikariPool, Prometheus и Garbage Collector.
Повествование будет строиться следующим образом: Я буду описывать потенциальные проблемные сценарии (use-case’ы) и шаги, которые необходимо предпринять для локализации и решения проблемы.
https://habr.com/ru/articles/837834/
👉@BookJava
Добрый день дорогой читатель. Сегодня я дам тебе несколько советов для поиска и анализа проблем в твоем Java приложении. Мы разберем такие вещи как: HeapDump, ThreadDump, VisualVM, Grafana, HikariPool, Prometheus и Garbage Collector.
Повествование будет строиться следующим образом: Я буду описывать потенциальные проблемные сценарии (use-case’ы) и шаги, которые необходимо предпринять для локализации и решения проблемы.
https://habr.com/ru/articles/837834/
👉@BookJava
👍5