При использовании
@SpringSecurity
вы можете получить доступ к текущим данным аутентификации, добавив объект Authentication в качестве параметра метода в классе @RestController.
@javatgPlease open Telegram to view this post
VIEW IN TELEGRAM
Quarkus — горячий тренд Java-разработки
Quarks ускоряет загрузку Java-приложений в CloudEra
Если вы занимаетесь разработкой Java-приложений, наверняка слышали о революционном фреймворке Quarkus. Если же еще не слышали, вот его краткое описание: Quarkus — это Kubernetes-нативный Java-стек, созданный для разработчиков, ставящих во главу угла производительность, гибкость и облачную нативную архитектуру.
В Quarkus реализован тот же подход, что и в Spring Boot, но с дополнительными преимуществами — меньшими артефактами с быстрой загрузкой, сокращением ресурсопотребления и повышением эффективности.
Ключевые особенности Quarkus, доказывающие его уникальность:
📌Читать
@javatg
Quarks ускоряет загрузку Java-приложений в CloudEra
Если вы занимаетесь разработкой Java-приложений, наверняка слышали о революционном фреймворке Quarkus. Если же еще не слышали, вот его краткое описание: Quarkus — это Kubernetes-нативный Java-стек, созданный для разработчиков, ставящих во главу угла производительность, гибкость и облачную нативную архитектуру.
В Quarkus реализован тот же подход, что и в Spring Boot, но с дополнительными преимуществами — меньшими артефактами с быстрой загрузкой, сокращением ресурсопотребления и повышением эффективности.
Ключевые особенности Quarkus, доказывающие его уникальность:
📌Читать
@javatg
Apache Kafka 3.7.0 только что вышел! 🔥
Что входит в этот новый релиз?
Вот основные функции, о которых вы должны знать: https://www.confluent.io/blog/introducing-apache-kafka-3-7/
@javatg
Что входит в этот новый релиз?
Вот основные функции, о которых вы должны знать: https://www.confluent.io/blog/introducing-apache-kafka-3-7/
@javatg
Дженерики могут показаться очень простой темой.
Например, вот так в Java выглядят классные и простые методы интерфейса
List
:interface List<E> extends Collection<E> {
boolean add(E e);
E set(int index, E element);
}
Но у обобщений много нюансов: вложенность, вариантность, границы и т.д. Это сильно усложняет их использование.
Вот не менее классный, но совсем непростой
flatMap
интерфейса Stream
🙈:interface Stream<T> extends BaseStream<T, Stream<T>> {
<R> Stream<R> flatMap(Function<? super T, ? extends Stream<? extends R>> mapper);
}
Реализация дженериков — всегда трейдоф. Мы либо получаем большой исполняемый файл, из-за того, что приходится генерировать код для разных типов. Либо получаем дополнительную нагрузку в рантайме, из-за различных проверок.
Такие вот дела ¯\_(ツ)_/¯
А вы что думаете по поводу дженериков в Java?
@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
🚀 Java 21 API 🚀
Новый метод string:
Разбивает строку на совпадения с заданным регулярным выражением и возвращает как строки, так и соответствующие разделители.
https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/String.html#splitWithDelimiters(java.lang.String,int limit)
@javatg
Новый метод string:
split With Delimiters(String regex, int limit)
Разбивает строку на совпадения с заданным регулярным выражением и возвращает как строки, так и соответствующие разделители.
https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/String.html#splitWithDelimiters(java.lang.String,int limit)
@javatg
Функция
MockedConstruction
из Mockito
позволяет моделировать конструкцию объектов во время тестирования. Традиционно, когда новый объект создается внутри тестируемого метода, сложно менять его поведение.
MockedConstruction
устраняет это ограничение, перехватывая процесс создания объекта, позволяя разработчикам указывать собственное поведение или возвращаемые значения для конструкторов.Вот некоторые базовые понятия:
MockedConstruction(Class<T>)
: создает макет для конструкций класса T, управляя макетами в пределах его области действияtry-with-resources
: инкапсулирует область имитации, обеспечивая автоматическую очистку ресурсов в конце блокаwhenever(mock.method(...)).thenReturn(...)
: настраивает макет поведения, динамически определяя ответы методаassertEquals(mock, times(n)).method(...)
: утверждает частоту взаимодействия с макетами.К примеру, вот так можно протестировать
Calculator.java
:public class Calculator {
public Calculator(){}
public int add(int a, int b) {
return a + b;
}
public int subtract(int a, int b) {
return a - b;
}
}
Теперь создадим тестовый класс
CalculatorTest
с использованием MockedConstruction
:public class CalculatorTest {
@Test
public void testAddition() {
try (MockedConstruction<Calculator> mocked = mockConstruction(Calculator.class)) {
// creating a mock instance
Calculator calculator = new Calculator();
// Mock behaviour
when(calculator.add(10, 20)).thenReturn(30);
when(calculator.subtract(30, 20)).thenReturn(10);
// Test the methods
assertEquals(30, calculator.add(10, 20));
assertEquals(10, calculator.subtract(30, 20));
// Get a list of all created mocks
List<Calculator> constructed = mocked.constructed();
assertEquals(1, constructed.size());
}
}
}
@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
Написать с нуля небольшой, но полноценный проект на Java — отличный способ прочувствовать особенности языка, потренировать полезные паттерны программирования. Вот 10 идей для пет-проектов, код к каждому прилагается
🔗 Код для этих пет-проектов здесь
@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
⚡️ Интересное видео и статья о том как Netflix использует Java
"Примерно за год или около того мы полностью стандартизировали Spring Boot". "Это довольно удивительно...что этот фреймворк был настолько стабильным и так хорошо развит". -
https://infoq.com/presentations/netflix-java
@javatg
"Примерно за год или около того мы полностью стандартизировали Spring Boot". "Это довольно удивительно...что этот фреймворк был настолько стабильным и так хорошо развит". -
https://infoq.com/presentations/netflix-java
@javatg
Довольно частый сценарий использования атомиков в качестве счётчиков выглядит так:
А так как отдельно метода
increment()
у него нет, то используются штатные getAndIncrement()
либо incrementAndGet()
без использования возвращаемого значения. Например:public void frequentlyCalledMethod(){
doSomeWork();
counter.incrementAndGet();
}
Или может
getAndIncrement()
? Хм… А в чём, собственно, разница, кроме очевидного из имени методов?public final int incrementAndGet() {
return U.getAndAddInt(this, VALUE, 1) + 1;
}
public final int getAndIncrement() {
return U.getAndAddInt(this, VALUE, 1);
}
Ну вы поняли. Мелочь конечно, но если всё равно отбрасываем результат, то зачем нам лишняя операция?
@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
Рефлексия в Java — это механизм, который позволяет разработчику вносить изменения и получать информацию о классах, интерфейсах, полях и методах во время выполнения, не зная их имен при этом.
Reflection API также помогает создавать новые экземпляры классов, вызывать методы и получать или устанавливать значения полей.
Давай соберем все возможности использования рефлексии в один список:
Рефлексия используется практически во всех современных технологиях Java и лежит в основе большинства современных Java/Java EE фреймворков и библиотек, например, в:
Если разрабтчик никогда не сталкивался с такого рода механизмами, то у него скорее всего возникнет закономерный вопрос — а зачем все это надо? Ответ в этом случае достаточно простой, но в то же время очень неопределенный: благодаря рефлексии мы кардинально повышаем гибкость и возможность настраивать приложение под себя и под свой код.
Ну а теперь немного о минусах:
classpath
, чтобы найти класс для загрузки. Это снижает производительность.Подробнее про Reflection можно прочитать здесь
@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
Конструктор — это специальный блок кода, который автоматически вызывается при создании нового объекта, помогая установить начальные значения.
Конструктор решает важную задачу: инициализацию объектов. Это значит, что он автоматически устанавливает нужные значения в момент создания объекта. Это делает процесс создания и использования объектов в программировании гораздо проще и быстрее.
Представим, что вы строите дом. Для начала вам нужен фундамент, стены, крыша и двери. В программировании "дом" – это объект, а чтобы его "построить", нам нужен конструктор.
class House {
int floors;
String color;
boolean hasGarage;
// Это конструктор
House(int floors, String color, boolean hasGarage) {
this.floors = floors;
this.color = color;
this.hasGarage = hasGarage;
}
}
public class Main {
public static void main(String[] args) {
// Создаем объект 'myHouse' с помощью конструктора
House myHouse = new House(2, "Синий", true);
System.out.println("Мой дом: Этажей – " + myHouse.floors + ", Цвет – " + myHouse.color + ", Наличие гаража – " + myHouse.hasGarage);
}
}
Конструкторы в Java делятся на несколько видов:
Инициализация объекта конструктором — ключевой момент в создании надежного и понятного кода. Конструкторы обеспечивают не только удобство инициализации, но и безопасность данных, позволяя избежать создания объекта в неполноценном или некорректном состоянии.
@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥Подборка лучших обучающих каналов для программистов.
➡️ Делитесь с коллегами и cохраняйте себе, чтобы не потерять
⚡️ Frontend
Javascript академия - крупнейший js канал
React - лучшие гайды и советы по работе с react
Frontend - тутрориалы, уроки, гайды, код
PHP
Книги frontend
Задачи frontend
💥 Хакинг Kali Linux
Kali linux
linux_kal - kali чат
Информационная безопасность
🚀 Data Science
Анализ данных - полезные фишки, код, гайды и советы, маст-хэв датасаентиста
Data Jobs - ds вакансии
Аналитик данных
Data Science книги - актуальные бесплатные книги
Big data
#️⃣C#
С# академия
С# заметки — код, лучшие практики, заметки программиста c#
С# задачи и тесты
С# библиотека - актуальные бесплатные книги
C# вакансии - работа
⚡Машинное обучение
Ml Собеседование - подготовка к собеседовению мл, алгоритмам, кодингу
Ml ru - актуальные статьи, новости, код и обучающие материалы
Ml Jobs - вакансии ML
ML Книги - актуальные бесплатные книги МО
ML чат
Machine Learning - полезные статьи новости гайды и разбор кода
🏆 Golang
Golang - подробные гайды, разбор кода, лучшие практики, заметки
Golang собеседование
Golang вакансии
Golang книги
Golang задачи и тесты
Golang чат
Golang news - новости go
🐍 Python
Python/django
Python Собеседование - подготовка к собеседовению python и разбор алгоритмов
Pro python - статьи, новости, код и обучающие материалы
Python Jobs - вакансии Python
Python чат
Python книги
☕ Java
Java академия
Java вакансии
Java чат
Java вопросы с собеседований
Java книги
🛢Базы данных
Sql базы данных
Библиотека баз данных
SQL чат
💻 C++
C++ академия
С++ книги
C++ задачи - подготовка к собеседовению мл, алгоритмам
C++ вакансии
🐧 Linux
Linux academy
🦀 Rust
Rust программирование
Rust чат
Rust книги для программистов
📲 Мобильная разработка
Android разработка
Мобильный разработчик гайды и уроки
🇬🇧 Английский для программистов
🧠 Искусственный интеллект
ИИ и технологии
Neural - нейросети для работы и жизни
Книги ИИ
Artificial Intelligence
🔥 DevOPs
Devops для программистов
Книги Devops
🌟 Docker/Kubernets
Docker
Kubernets
📓 Книги
Библиотеки Книг для программситов
💼 Папка с вакансиями:
Папка Go разработчика:
Папка Python разработчика:
Папка Data Science
Папка Java разработчика
Папка C#
Папка Frontend
➡️ Делитесь с коллегами и cохраняйте себе, чтобы не потерять
⚡️ Frontend
Javascript академия - крупнейший js канал
React - лучшие гайды и советы по работе с react
Frontend - тутрориалы, уроки, гайды, код
PHP
Книги frontend
Задачи frontend
💥 Хакинг Kali Linux
Kali linux
linux_kal - kali чат
Информационная безопасность
🚀 Data Science
Анализ данных - полезные фишки, код, гайды и советы, маст-хэв датасаентиста
Data Jobs - ds вакансии
Аналитик данных
Data Science книги - актуальные бесплатные книги
Big data
#️⃣C#
С# академия
С# заметки — код, лучшие практики, заметки программиста c#
С# задачи и тесты
С# библиотека - актуальные бесплатные книги
C# вакансии - работа
⚡Машинное обучение
Ml Собеседование - подготовка к собеседовению мл, алгоритмам, кодингу
Ml ru - актуальные статьи, новости, код и обучающие материалы
Ml Jobs - вакансии ML
ML Книги - актуальные бесплатные книги МО
ML чат
Machine Learning - полезные статьи новости гайды и разбор кода
🏆 Golang
Golang - подробные гайды, разбор кода, лучшие практики, заметки
Golang собеседование
Golang вакансии
Golang книги
Golang задачи и тесты
Golang чат
Golang news - новости go
🐍 Python
Python/django
Python Собеседование - подготовка к собеседовению python и разбор алгоритмов
Pro python - статьи, новости, код и обучающие материалы
Python Jobs - вакансии Python
Python чат
Python книги
☕ Java
Java академия
Java вакансии
Java чат
Java вопросы с собеседований
Java книги
🛢Базы данных
Sql базы данных
Библиотека баз данных
SQL чат
💻 C++
C++ академия
С++ книги
C++ задачи - подготовка к собеседовению мл, алгоритмам
C++ вакансии
🐧 Linux
Linux academy
🦀 Rust
Rust программирование
Rust чат
Rust книги для программистов
📲 Мобильная разработка
Android разработка
Мобильный разработчик гайды и уроки
🇬🇧 Английский для программистов
🧠 Искусственный интеллект
ИИ и технологии
Neural - нейросети для работы и жизни
Книги ИИ
Artificial Intelligence
🔥 DevOPs
Devops для программистов
Книги Devops
🌟 Docker/Kubernets
Docker
Kubernets
📓 Книги
Библиотеки Книг для программситов
💼 Папка с вакансиями:
Папка Go разработчика:
Папка Python разработчика:
Папка Data Science
Папка Java разработчика
Папка C#
Папка Frontend
com
и org
в Java сводится к тому, чтобы отразить доменное имя организации в структуре пакетов. com
обычно ассоциируется с коммерческими компаниями, тогда как org
используется для обозначения некоммерческих организаций. Для уникальности рекомендуется использовать доменное имя в обратном порядке, например, com.example
.// Для коммерческих организаций
package com.example.checkOutMyProfit;
// Для некоммерческих организаций
package org.example.utilityToTheRescue;
Такой подход позволяет предотвратить конфликты имен и улучшает идентифицируемость проекта в среде Java.
Префиксы
edu.
и net.
не так широко распространены, но тем не менее они имеют своё применение. edu.
обычно используют учебные заведения, в то время как net.
предпочитают любители сетевых технологий. Они служат отражением определённых "районов" в виртуальном "городе программных решений", обслуживая определённые сообщества.Структура пакетов должна отражать логику и организацию вашего бизнеса или проекта. Это не только демонстрирует корпоративную культуру и дисциплину в программировании, но и способствует построению интуитивно понятной и легко навигируемой кодовой базы.
Для предотвращения пересечений имён в Java рекомендуется начинать имя пакета с домена компании, представленного в обратном порядке. Например, для домена
example.com
, имя пакета должно начинаться с com.example
. Такой подход обеспечивает уникальность пространства имен на глобальном уровне и снижает риск конфликтов.Перед присвоением имени пакету убедитесь, что вы владеете доменом. Пакеты с префиксами
java.
, javax.
и sun.
зарезервированы компанией Oracle, и их использование может столкнуться с юридическими последствиями или вызвать негативную реакцию сообщества.@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Коллекции
Collection
представляют собой группу объектов, а Java предоставляет несколько интерфейсов и реализаций для работы с этими коллекциями. С появлением многопоточного программирования возросла потребность в потокобезопасных коллекциях. Именно тогда в структуру
Java Collection
были добавлены синхронизированные коллекции. Синхронизированные коллекции
Synchronized Collections
обеспечивают потокобезопасность за счет принудительной синхронизации каждого из общедоступных методов. Кроме того, это гарантирует, что его внутреннее состояние никогда не будет опубликовано. То есть, единственный способ изменить коллекцию — это использовать ее общедоступные синхронизированные методы!Синхронизированные коллекции можно представить, как простые несинхронизированные коллекции с инкапсуляцией состояния и синхронизированными общедоступными методами.
Поскольку одна и та же (внутренняя) блокировка защищает каждый общедоступный метод синхронизированной коллекции, какие-либо два потока не могут изменять/читать коллекцию одновременно.
Класс
Collections
предоставляет несколько статических методов для создания синхронизированных коллекций. Эти статические методы имеют имена в следующем формате — synchronizedXxx
. Вот список этих методов:synchronizedCollection(Collection<T> c)
synchronizedList(List<T> list)
synchronizedMap(Map<K, V> m)
synchronizedNavigableMap(NavigableMap<K, V> m)
synchronizedNavigableSet(NavigableSet<T> s)
synchronizedSet(Set<T> s)
synchronizedSortedMap(SortedMap<K, V> m)
synchronizedSortedSet(SortedSet<T> s)
Теперь мы создадим синхронизированный список, используя класс Collections.
List<Integer> synchronizedIntegerList = Collections.synchronizedList(new ArrayList<>());
@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
Репозиторий содержит материалы для подготовки к собеседованию по кодингу, включая:
- Более 350 решений LeetCode
- 30 концепций проектирования систем
- 40 Задач системного проектирования, упорядоченных по сложности
Цель этого репозитория - собрать лучшие ресурсы для подготовки к собеседованию по проектированию систем.
▪Github
@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
🛠️ Расширение Spring Data JPA, позволяющее полностью динамически использовать Entity Graph в репозиториях.
Entity Graph - позволяет улучшить производительность во время выполнения запросов к базе данных при загрузке связанных ассоциаций и основных полей объекта.
👉 https://github.com/Cosium/spring-data-jpa-entity-graph
@javatg
Entity Graph - позволяет улучшить производительность во время выполнения запросов к базе данных при загрузке связанных ассоциаций и основных полей объекта.
👉 https://github.com/Cosium/spring-data-jpa-entity-graph
@javatg
Если по какой-то причине ты ещё об этом не знаешь, существует система документирования кода — Doxygen
Doxygen — это система документирования кода, которая позволяет автоматически генерировать документацию на основе комментариев. Она поддерживает различные языки программирования, включая Java.
Doxygen позволяет генерировать документацию в различных форматах, таких как HTML, LaTeX, RTF, XML и других. Для использования Doxygen с Java необходимо следовать определенным шаблонам комментариев.
/**
* Описание класса.
*/
public class MyClass {
// код класса
}
Doxygen будет использовать этот комментарий для генерации документации, включая описание класса и его членов.
/**
* Описание класса.
*/
public class MyClass {
/**
* Описание метода.
* @param param Описание параметра.
* @return Описание возвращаемого значения.
*/
public int myMethod(int param) {
// код метода
return param;
}
}
Doxygen сгенерирует документацию, включая описание класса и метода, а также информацию о параметрах и возвращаемом значении.
В общем, используй Doxygen — будущим коллегам будет легче разбираться с твоим спагетти)
@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM