10986
📚 Лайфхаки, приёмы и лучшие практики для Java-разработчиков. Всё, что ускорит код и прокачает навыки. Java, Spring, Maven, Hibernate. По всем вопросам @evgenycarter РКН clck.ru/3KoGeP
☕ Совет дня по Java: JDK vs JRE vs JVM
🔹 JVM (Java Virtual Machine)
Машина, которая выполняет Java-байткод, обеспечивая кроссплатформенность.
🔹 JRE (Java Runtime Environment)
Содержит JVM + необходимые библиотеки для запуска Java-приложений.
🔹 JDK (Java Development Kit)
Всё, что нужно разработчику — JRE + компилятор + инструменты для написания, компиляции и отладки Java-кода.
👉 Если запускаешь Java-приложения → тебе нужен JRE
👉 Если разрабатываешь Java-приложения → тебе нужен JDK
👉 А выполняет всю тяжёлую работу всегда JVM.
👉 @BookJava
Конструкторы в Java: виды, инициализация и примеры
В Java конструктор — это специальный метод, который автоматически вызывается при создании нового объекта. Он заботится о том, чтобы сразу «обеспечить» объект всеми необходимыми начальным значениями - как Lego‑инструкция, превращающая вас в сразу работающего робота.
Что важно знать о конструкторах:
- Конструктор по умолчанию
Создаётся автоматически, если вы не объявили ни одного конструктора. Не имеет параметров и не задаёт пользовательские значения - поля получают только значения по умолчанию.
- Конструктор с параметрами
Позволяет инициализировать объект сразу нужными данными:
House myHouse = new House(2, "Синий", true);
House(...).
class Book {
String title;
String author;
int year;
// По умолчанию
Book() {
this.title = "Неизвестно";
this.author = "Неизвестно";
this.year = 0;
}
// Только с названием
Book(String title) { /*...*/ }
// Полная инициализация
Book(String title, String author, int year) { /*...*/ }
}
Book с разными уровнями наполненности в зависимости от ситуации.Person
class Person {
String name;
int age;
Person(String name, int age) {
this.name = name;
this.age = age;
}
}
Person person = new Person("Алексей", 30);
person сразу с заданными именем и возрастом - без лишнего кода.
🧠 Можно ли переопределить getClass() в Java?
Нет, нельзя.
Метод getClass() в java.lang.Object объявлен так:
public final native Class<?> getClass();
final — запрещает переопределение в наследниках.native — реализован в JVM, а не на Java.obj.getClass() всегда вернётся реальный класс объекта, без подмен и сюрпризов.
class MyClass {
public String getTypeName() {
return "CustomType";
}
}
getClass() сломал бы рефлексию, сериализацию и кучу системных механизмов. Именно поэтому Java защищает его.
💡Совет по Java №1: Прощай, многословные объявления переменных — здравствуй, var !
Java 8 vs Java 21 — Часть 1
Одно из самых заметных улучшений при переходе с Java 8 на современные версии — это введение локальной типовой инференции, более известной как ключевое слово var. Появившееся в Java 10, это нововведение устраняет избыточные объявления типов и делает код чище и читаемее.
Проблема Java 8
В Java 8 приходилось явно указывать тип каждой локальной переменной, даже когда он был очевиден из контекста:
// Java 8 - Verbose and redundant
Map<String, List<Customer>> customersByCity = new HashMap<String, List<Customer>>();
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
Optional<Customer> customer = customerService.findById(123L);
var компилятор автоматически выводит тип:
// Java 21 - Clean and concise
var customersByCity = new HashMap<String, List<Customer>>();
var names = Arrays.asList("Alice", "Bob", "Charlie");
var customer = customerService.findById(123L);
// Before (Java 8)
List<Map<String, Object>> configurations = new ArrayList<Map<String, Object>>();
Map<String, List<ValidationResult>> validationResults = new ConcurrentHashMap<String, List<ValidationResult>>();
// After (Java 21)
var configurations = new ArrayList<Map<String, Object>>();
var validationResults = new ConcurrentHashMap<String, List<ValidationResult>>();
// Before (Java 8)
HttpURLConnection connection = (HttpURLConnection) new URL("https://api.example.com")
.openConnection();
// After (Java 21)
var connection = (HttpURLConnection) new URL("https://api.example.com")
.openConnection();
```Java
3. Потоковые операции
```Java
// Before (Java 8)
Stream<String> filteredNames = customers.stream()
.map(Customer::getName)
.filter(name -> name.startsWith("A"));
// After (Java 21)
var filteredNames = customers.stream()
.map(Customer::getName)
.filter(name -> name.startsWith("A"));
var (лучшие практики)
// Clear from initialization
var users = new ArrayList<User>();
var config = ConfigurationBuilder.create().build();
var response = httpClient.execute(request);
// With method calls that have descriptive names
var isValid = validator.validateEmail(email);
var totalAmount = calculator.computeTotal(items);
// Type is not obvious
var data = processData(); // What type is this?
var result = calculate(); // Unclear return type
// Primitives where explicitness helps
int count = 0; // Better than var count = 0;
boolean isActive = true; // Better than var isActive = true;
var там, где он улучшает восприятие кода.var.var:var — это исключительно функция времени компиляции, без какого‑либо накладного расхода во время выполнения. Сгенерированный байткод полностью идентичен коду с явно указанными типами.
💡10 незаменимых советов и приёмов Java, которые должен знать каждый разработчик
1. Используйте улучшенный цикл for
Улучшенный цикл for, появившийся в Java 5, позволяет лаконично и эффективно проходить по массивам и коллекциям. Вместо традиционного цикла с индексами можно итерироваться напрямую по элементам, что повышает читаемость кода и снижает вероятность ошибок выхода за пределы массива.
int[] numbers = {1, 2, 3, 4, 5};
for (int number : numbers) {
System.out.println(number);
}
List<String> names = new ArrayList<>();
names.add("John");
names.add("Jane");
String firstName = names.get(0);
StringBuilder работает эффективнее, чем оператор + или методы конкатенации. StringBuilder изменяем (mutable) и предоставляет удобные методы для работы со строками.
StringBuilder message = new StringBuilder("Hello");
message.append(" World");
message.insert(5, " Java");
String result = message.toString();
try-with-resources гарантирует автоматическое закрытие ресурсов, даже если произойдут исключения. Это упрощает управление ресурсами и снижает риск утечек.
try (FileReader fileReader = new FileReader("data.txt");
BufferedReader bufferedReader = new BufferedReader(fileReader)) {
String line = bufferedReader.readLine();
// Process the data
} catch (IOException e) {
// Handle the exception
}
enum, а не простые переменные или целочисленные константы. Перечисления обеспечивают безопасность типов, улучшают читаемость кода и легко расширяются.
enum Days {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}
Days today = Days.MONDAY;
break позволяет выйти из цикла досрочно, а continue — пропустить текущую итерацию и перейти к следующей. Грамотное использование этих операторов делает код более эффективным и читаемым.
for (int i = 1; i <= 10; i++) {
if (i == 5) {
break; // Exit the loop when i equals 5
}
if (i % 2 == 0) {
continue; // Skip even numbers
}
System.out.println(i);
}
Какова цель ключевого слова static в Java?
Ключевое слово static в Java используется для объявления членов (переменных, методов, вложенных классов), которые принадлежат самому классу, а не его экземплярам.
Объявление статических членов позволяет делиться данными между всеми экземплярами класса, создавать утилитарные методы, которые не требуют создания объекта, или определять ограничения.
Например, в следующем классе BankAccount переменные totalAccounts и INTEREST_RATE являются статическими, поэтому они будут доступны только внутри самого класса.
public class BankAccount {
private String accountHolder;
private double balance;
private static int totalAccounts = 0;
private static final double INTEREST_RATE = 0.05;
// The rest of the code here ...
}
Как обрабатывать исключения в Java?
Исключения в Java можно аккуратно обрабатывать с помощью блоков try-catch. В блоке try пишется код, который может выбросить исключение, а в блоке catch — что нужно сделать, если это исключение произошло.
Блок finally можно использовать для операций очистки, если в try-catch задействованы внешние ресурсы, такие как файловые менеджеры, соединения с базой данных и т.д.
Вот пример кода, демонстрирующий обработку исключений в Java:
import java.io.FileReader;
import java.io.IOException;
public class ExceptionHandlingExample {
public static void main(String[] args) {
FileReader reader = null;
try {
reader = new FileReader("nonexistent.txt");
// Code that might throw an exception
int character = reader.read();
System.out.println((char) character);
} catch (IOException e) {
// Handling the specific exception
System.out.println("An error occurred while reading the file: " + e.getMessage());
} finally {
// Cleanup code that always executes
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
System.out.println("Error closing file: " + e.getMessage());
}
}
}
}
}
🚀 Подборка Telegram каналов для программистов
Системное администрирование, DevOps 📌
/channel/bash_srv Bash Советы
/channel/win_sysadmin Системный Администратор Windows
/channel/sysadmin_girl Девочка Сисадмин
/channel/srv_admin_linux Админские угодья
/channel/linux_srv Типичный Сисадмин
/channel/devopslib Библиотека девопса | DevOps, SRE, Sysadmin
/channel/linux_odmin Linux: Системный администратор
/channel/devops_star DevOps Star (Звезда Девопса)
/channel/i_linux Системный администратор
/channel/linuxchmod Linux
/channel/sys_adminos Системный Администратор
/channel/tipsysdmin Типичный Сисадмин (фото железа, было/стало)
/channel/sysadminof Книги для админов, полезные материалы
/channel/i_odmin Все для системного администратора
/channel/i_odmin_book Библиотека Системного Администратора
/channel/i_odmin_chat Чат системных администраторов
/channel/i_DevOps DevOps: Пишем о Docker, Kubernetes и др.
/channel/sysadminoff Новости Линукс Linux
1C разработка 📌
/channel/odin1C_rus Cтатьи, курсы, советы, шаблоны кода 1С
/channel/DevLab1C 1С:Предприятие 8
/channel/razrab_1C 1C Разработчик
/channel/buh1C_prog 1C Программист | Бухгалтерия и Учёт
/channel/rabota1C_rus Вакансии для программистов 1С
Программирование C++📌
/channel/cpp_lib Библиотека C/C++ разработчика
/channel/cpp_knigi Книги для программистов C/C++
/channel/cpp_geek Учим C/C++ на примерах
Программирование Python 📌
/channel/pythonofff Python академия.
/channel/BookPython Библиотека Python разработчика
/channel/python_real Python подборки на русском и английском
/channel/python_360 Книги по Python
Java разработка 📌
/channel/BookJava Библиотека Java разработчика
/channel/java_360 Книги по Java Rus
/channel/java_geek Учим Java на примерах
GitHub Сообщество 📌
/channel/Githublib Интересное из GitHub
Базы данных (Data Base) 📌
/channel/database_info Все про базы данных
Мобильная разработка: iOS, Android 📌
/channel/developer_mobila Мобильная разработка
/channel/kotlin_lib Подборки полезного материала по Kotlin
Фронтенд разработка 📌
/channel/frontend_1 Подборки для frontend разработчиков
/channel/frontend_sovet Frontend советы, примеры и практика!
/channel/React_lib Подборки по React js и все что с ним связано
Разработка игр 📌
/channel/game_devv Все о разработке игр
Библиотеки 📌
/channel/book_for_dev Книги для программистов Rus
/channel/programmist_of Книги по программированию
/channel/proglb Библиотека программиста
/channel/bfbook Книги для программистов
БигДата, машинное обучение 📌
/channel/bigdata_1 Big Data, Machine Learning
Программирование 📌
/channel/bookflow Лекции, видеоуроки, доклады с IT конференций
/channel/rust_lib Полезный контент по программированию на Rust
/channel/golang_lib Библиотека Go (Golang) разработчика
/channel/itmozg Программисты, дизайнеры, новости из мира IT
/channel/php_lib Библиотека PHP программиста 👨🏼💻👩💻
/channel/nodejs_lib Подборки по Node js и все что с ним связано
/channel/ruby_lib Библиотека Ruby программиста
/channel/lifeproger Жизнь программиста. Авторский канал.
QA, тестирование 📌
/channel/testlab_qa Библиотека тестировщика
Шутки программистов 📌
/channel/itumor Шутки программистов
Защита, взлом, безопасность 📌
/channel/thehaking Канал о кибербезопасности
/channel/xakep_2 Хакер Free
Книги, статьи для дизайнеров 📌
/channel/ux_web Статьи, книги для дизайнеров
Математика 📌
/channel/Pomatematike Канал по математике
/channel/phis_mat Обучающие видео, книги по Физике и Математике
/channel/matgeoru Математика | Геометрия | Логика
Excel лайфхак📌
/channel/Excel_lifehack
/channel/mir_teh Мир технологий (Technology World)
Вакансии 📌
/channel/sysadmin_rabota Системный Администратор
/channel/progjob Вакансии в IT
👩💻 31 июля стартует курс «Java-разработчик» от OTUS — это то, что нужно, если вы хотите успешно вкатиться в разработку в 2025
🦾 Вас ждет огромное количество практики и реальные кейсы: настройка окружения, базовые алгоритмы, синтаксис Java, Spring и Docker. Мы покажем, почему диплом OTUS ценят HR в крупных компаниях.
Если вы сисадмин, тестировщик, аналитик или просто хотите освоить программирование с нуля — этот курс для вас.
Мы научим создавать серверные веб-приложения, работать с PostgreSQL, Kafka и Kubernetes, формировать портфолио и готовить резюме под Middle-Java-Dev.
🎁 Дарим промокод, который дает скидку на обучение - JAVA7
👉 Оставьте заявку и и присоединяйтесь к группе: https://vk.cc/cNTEMq
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
🧠 Как ускорить Spring Boot при старте: spring-context-indexer
При старте Spring Boot-приложения много времени уходит на classpath scanning. Даже если вы используете @ComponentScan, Spring всё равно перебирает кучу классов в поиске бин-кандидатов. Это рефлексивно и медленно.
📌 Есть способ это оптимизировать — spring-context-indexer.
🔧 Что делать
1. Добавьте зависимость в pom.xml:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-indexer</artifactId>
<version>6.1.3</version> <!-- актуальная для Spring Boot 3 -->
<optional>true</optional>
</dependency>
@Component, @Service, @Repository, и т.п.) в META-INF/spring.components.Settings → Build, Execution, Deployment → Compiler → Annotation Processors).
Определение и отличие IP адресов LAN, PPP в Java
Чтобы определить IP-адрес локальной машины с использованием Java, примените следующий код:
import java.net.*;
public class GetIP {
public static void main(String[] args) throws UnknownHostException {
System.out.println(InetAddress.getLocalHost().getHostAddress());
}
}
import java.net.*;
import java.util.*;
public class GetMultiIPs {
public static void main(String[] args) throws SocketException {
Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
while (interfaces.hasMoreElements()) {
NetworkInterface iface = interfaces.nextElement();
if (iface.isLoopback() || !iface.isUp()) continue;
Enumeration<InetAddress> addresses = iface.getInetAddresses();
while(addresses.hasMoreElements()) {
InetAddress addr = addresses.nextElement();
if (addr instanceof Inet4Address) {
System.out.println(iface.getDisplayName() + " – " + addr.getHostAddress());
}
}
}
}
}
👩💻Открытый урок «Как победить кодировки и стать Гуру Unicode?».
🗓 17 июля в 20:00 МСК
🆓 Бесплатно. Урок в рамках старта курса «Java-разработчик».
Ошибки в кодировках ломают приложения, превращая текст в «абракадабру». Понимание таблиц кодировок — must-have навык для работы с данными, файлами и международными проектами.
О чём поговорим:
✔️ ASCII, UTF-8, Unicode — WTF? Разберём, как Java хранит и обрабатывает текст.
✔️ Почему файлы «ломаются»? Как избежать ошибок при чтении/записи данных.
✔️ Лайфхаки для юникода: работа с иероглифами и русским языком.
✔️ Секреты JVM: как настроить кодировку в проекте.
Кому будет интересно:
Начинающим Java-разработчикам и тестировщикам, сталкивающимся с международными данными и проблемами кодировки.
🔗 Ссылка на регистрацию: https://vk.cc/cNHXJC
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Советы по Java 💡
Как инициализировать collections или map в Java? Конечно, вы можете использовать, например, статическую инициализацию фабрики (`List.of(...)` или `Map.of(...)`).
Но вы также можете воспользоваться функцией "инициализации двойной скобкой"
👉@BookJava
Совет 💡
Если вы хотите получить сообщение о первопричине, вы можете легко и безопасно получить его с помощью Apache Commons ExceptionUtils. Методы getRootCauseMessage(Exception ex) выдают сообщение в виде {ClassNameWithoutPackage} {ThrowableMessage}
👉@BookJava
Java spring exception handling | обработка исключений за 5 минут
В этом видео речь пойдет об обработке исключений на уровне контроллера на языке Java. Покажу, какие инструменты есть у Spring.
00:23 - try catch, ResponseEntity
00:47 - наследование ResponseStatusException
01:10 - настройки отображения сообщения, названия ошибки и стек трейс в ответе
01:47 - бросаем ResponseStatusException
02:04 - аннотация @ ExceptionHandler
03:05 - аннотация @ RestControllerAdvice
03:40 - кастомный объект вместо ResponseEntity
04:02 - аннотация @ ResponseStatus
Код можно посмотреть тут: https://github.com/dispikerton/exceptionHandling
источник
👉@BookJava
🚀 Хотите научиться интегрировать Apache Kafka и ClickHouse для эффективной обработки и анализа данных? 🚀
Присоединяйтесь к открытому уроку 20 августа в 20:00 МСК!
📚 Мы разберём, как настроить потоковую передачу данных, обеспечить надёжность и производительность, а также оптимизировать хранение и запросы. Вы узнаете, как использовать нативные коннекторы и Kafka Connect для интеграции этих двух мощных инструментов.
Мы покажем реальные кейсы, лучшие практики и как избежать частых ошибок при работе с Kafka и ClickHouse. Это знание поможет вам настроить эффективный pipeline и ускорить загрузку данных.
Присоединяйтесь и получите скидку на курс «Apache Kafka»:
https://vk.cc/cOz3C2
🎯 Не пропустите!
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
Spring Debugger: Working With Dynamic Database Connections Just Got Simpler
Туториал демонстрирует очень крутую фичу плагина Spring Debugger. При запуске Spring-приложения или тестов в режиме отладки этот плагин автоматически находит и регистрирует в секции DataSource подключения к БД, которые были подняты в Testcontainers. Далее с этим можно работать как со стандартными дата-сорсами: смотреть схему, данные, делать запросы и так далее. Это сильно упрощает жизнь при отладке подобных тестов.
https://blog.jetbrains.com/idea/2025/07/spring-debugger-working-with-dynamic-database-connections-just-got-simpler/
👉 @BookJava
Распространённые заблуждения
❌ «var делает Java динамически типизированным»
Неверно: Java остаётся статически типизированным языком. Компилятор по‑прежнему проверяет типы на этапе компиляции.
❌ «var ухудшает производительность»
Неверно: Никакого влияния на выполнение. Это всего лишь синтаксический сахар.
❌ «var снижает читаемость кода»
Зависит: При правильном использовании — улучшает читаемость, убирая лишний шум. При чрезмерном — может сделать код менее понятным.
Чек‑лист быстрой миграции
[ ] Найдите многословные объявления переменных в кодовой базе
[ ] Замените очевидные случаи на var (сложные дженерики, builders)
[ ] Установите командные правила использования var
[ ] Обновите процессы код‑ревью с учётом лучших практик применения var
[ ] Используйте возможности IDE для проверки выведенных типов
Итог
Локальная типовая инференция с var — небольшое изменение, которое значительно улучшает читаемость кода и опыт разработчика. Речь не о том, чтобы писать меньше кода, а о том, чтобы писать более понятный и поддерживаемый код, избавляясь от избыточных объявлений типов.
Начните использовать var уже сегодня — и сразу заметите, насколько чище станет ваш Java‑код!
👉@BookJava
⁉️ Хотите научиться строить масштабируемые и отказоустойчивые решения на Kafka?
На открытом уроке «Архитектурные паттерны работы с Kafka: от простого к масштабируемому» 13 августа в 18:00 МСК мы разберем основные паттерны и архитектурные подходы для работы с Kafka в микросервисах. Вы освоите Event Sourcing и CQRS и узнаете, как правильно обрабатывать ошибки и гарантировать доставку сообщений.
Этот урок откроет перед вами новые возможности: вы научитесь строить архитектуру для обработки больших потоков данных и получите опыт работы с реальными кейсами.
➡️ Присоединяйтесь и получите скидку на большой курс «Apache Kafka»: https://vk.cc/cOir4i
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
В чём разница между == и .equals() при сравнении строк?== сравнивает ссылки на объекты (адреса в памяти), а .equals() сравнивает содержимое строк. Для сравнения строк всегда используйте .equals().
Вот пример, иллюстрирующий разницу:
String str1 = "Hello";
String str2 = "Hello";
String str3 = new String("Hello");
System.out.println(str1 == str2); // true (один и тот же объект)
System.out.println(str1 == str3); // false (разные объекты)
System.out.println(str1.equals(str2)); // true (одинаковое содержимое)
System.out.println(str1.equals(str3)); // true (одинаковое содержимое)
⁉️👩💻Разрабатываете на Java, но проект на Spring превращается в черный ящик? Бины ведут себя непредсказуемо, конфигурация разрастается, а ошибка в одном модуле рушит всю систему.
Интервью на позицию Middle неудачно — не хватает уверенности в Spring.
🤝 Тем временем рынок требует специалистов, которые не просто знают Spring, а умеют строить продакшен-приложения с его помощью. Компании ищут разработчиков, которые понимают, как работают Spring Boot, Spring Security, Spring MVC и могут строить микросервисную архитектуру.
⚡️ На курсе «Разработчик на Spring Framework» мы закроем пробелы и дадим актуальные навыки. Практика на реальных кейсах, ревью заданий, тестовое собеседование — вы освоите Spring так, чтобы уверенно применять его в работе.
➡️ Пройдите вступительное тестирование и получите скидку на обучение: https://vk.cc/cO9GA3
🎁 Дарим промокод, который дает скидку на обучение - SRING7
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Совет 💡
Добавьте в JDBC URL свойство ApplicationName (зависит от БД, не в каждой БД оно есть!). Таким образом, в списке сессий вместо имени JDBC-драйвера будет отображаться имя набора. Это поможет при поиске неисправностей, когда несколько приложений подключаются к одной и той же БД.
👉@BookJava
🧠 Быстрый профилинг Java: -XX:+PrintCompilation
Хотите понять, что JIT-компилятор делает с вашим кодом и где реально тратится время?
Есть скрытая, но очень полезная фича JVM — флаг:
java -XX:+UnlockDiagnosticVMOptions -XX:+PrintCompilation -jar app.jar
-XX:+PrintInlining — покажет какие методы JVM решила инлайнить (и почему отказалась).
Функциональное программирование в Java с использованием потоков (Streams) и лямбд (Lambdas)
Потоки обрабатывают фильтрацию, сортировку и агрегацию, а лямбды упрощают определение функций.
В Spring они лежат в основе реактивных API, а в соревновательном программировании — позволяют оптимизировать работу с данными.
Пример ниже демонстрирует REST-эндпоинт на Spring для фильтрации пользователей и алгоритм в стиле соревнований для поиска лучшего игрока.
👉@BookJava
👩💻 Ваши Java-приложения под нагрузкой едва дышат? Профилирование и оптимизация кода остаются за скобками?
Курс «Java Developer. Advanced» от OTUS — это глубокое погружение в устройство JVM, байткод, сборщики мусора, профилирование и оптимизацию в облаке.
Наши эксперты-практики покажут, как выбрать GC, снять дамп памяти и обнаружить утечки, как профилировать “горячие” места, настраивать интеграцию с Prometheus & Grafana и деплоить сервисы в Kubernetes.
🦾 Вы научитесь обосновывать выбор JVM-имплементации, анализировать heap-дампы, синхронизировать потоки, использовать Reactor и неблокирующие I/O, проектировать метрики и трассировку.
🎁 Дарим промокод, который дает скидку на обучение - JVADV7
➡️ Пройдите короткий тест и присоединяйтесь к группе: https://vk.cc/cNLBLc
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Совет по Java 💡
Чтобы сделать большие и сложные цепочки компараторов более читаемыми, мне нравится присваивать компараторы переменным, имена которых начинаются с "by". Таким образом, вызов sorted() становится меньше и читается почти как естественный язык. Кроме того, вы можете использовать статический импорт.
👉@BookJava
В чем суть принципа DI из SOLID, и почему с ним так много проблем?
DI — это Dependency Inversion Principle, последний принцип из SOLID. Его суть:
🧠 Модули верхнего уровня не должны зависеть от модулей нижнего уровня. И те, и другие должны зависеть от абстракций. Абстракции не должны зависеть от деталей. Детали должны зависеть от абстракций.
new внутри), он получает их снаружи — через конструктор, сеттер или метод. Это и называется внедрение зависимостей (Dependency Injection).
class UserService {
private final UserRepository repo = new UserRepository(); // жесткая связка
}
class UserService {
private final UserRepository repo;
public UserService(UserRepository repo) {
this.repo = repo;
}
}
UserRepository, например, на InMemoryUserRepository в тестах — и UserService даже не узнает.
Новая вакансия! Стажёр, мечтающий построить карьеру в ИТ
📍 Локация: вся Россия и всемирная сеть Интернет
График: свободный
Опыт: необязателен, но желание и любопытство — строго необходимо.
📝 Задачи:
– листать свежие стажировки и откликаться по ссылкам,
– читать истории других стажёров,
– заглядывать на вебинары, хакатоны и карьерные мероприятия,
– задавать вопросы и учиться.
💡 От нас:
– возможность трудоустройства в атомной отрасли,
– шанс поработать под руководством топовых ИТ-экспертов
– сообщество таких же увлечённых молодых специалистов.
Подписывайтесь на ИТ-стажировки Росатома и следите за обновлениями.
⚖️ 👩💻 LangChain в Java: Langchain4j, Quarkus, Spring Boot
LangChain открывает мощные возможности LLM в приложениях Java, упрощая интеграцию ИИ в сервисы на Quarkus и Spring Boot.
🗓 17 июня в 20:00 МСК
🆓 Бесплатно. Урок в рамках старта курса «Java Developer. Advanced».
📌О чём поговорим:
- Framework LangChain: ключевые концепции и архитектура.
- Langchain4j: возможности Java-библиотеки.
- Интеграция Langchain4j в проекты на Spring Boot и Quarkus.
- Spring AI: фреймворк для работы с LLM в Spring.
📌Кому будет интересно:
Java-разработчикам, архитекторам ПО и инженерам ML Ops, планирующим внедрять LLM в микросервисы на Quarkus или Spring Boot.
📌В результате урока вы:
Познакомитесь с Langchain4j и сможете написать простой Java-сервис, использующий LLM.
🔗 Ссылка на регистрацию: https://vk.cc/cNzO2i
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Как просуммировать элементы массива?
👉@BookJava