10986
📚 Лайфхаки, приёмы и лучшие практики для Java-разработчиков. Всё, что ускорит код и прокачает навыки. Java, Spring, Maven, Hibernate. По всем вопросам @evgenycarter РКН clck.ru/3KoGeP
Совет по Java💡show-sql - это самый простой (но не самый лучший!) способ увидеть SQL, сгенерированный Hibernate. Вы можете немного улучшить его, включив форматирование, показ JPQL-запроса, сгенерировавшего запрос, и включив подсветку, которая добавляет некоторый цвет к выводу.
👉@BookJava
REST или GraphQL? Этот выбор может определить, насколько удобным, быстрым и масштабируемым будет ваш API.
26 августа в 20:00 на открытом уроке мы разберём, когда стоит выбрать REST, а когда — GraphQL, а также реализуем оба подхода в Spring Boot. Эксперт покажет критерии выбора, разберёт практические кейсы и типичные ошибки.
Backend-разработчики на Java/Kotlin и тимлиды узнают, как применять эти технологии на практике, чтобы их проекты работали быстрее, были проще в сопровождении и готовыми к росту.
Вебинар проходит в преддверие старта курса «Разработчик на Spring Framework».
Регистрируйтесь сейчас и получите скидку на обучение: https://vk.cc/cOMqtr
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Где у Java приложения точка входа?
В обычном 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. Проблема с null. Null safety
В этом видео я рассказываю о проблеме с null в языке программирования Java, из-за которой возникает печально известное NullPointerExeption. Даю некоторые рекомендации по организации кода для борьбы с этой проблемой и повышения надежности работы программ.
источник
👉@BookJava
👩💻 Открытый урок «Лучшие практики Kafka и Schema Registry в backend-разработке на Java».
Kafka уже стала стандартом для высоконагруженных систем, а Schema Registry — ключом к надёжной работе с данными.
Хотите уверенно интегрировать их в свои Java-проекты?
Приглашаем на открытый урок
🗓 26 августа в 20:00 МСК
🆓 Бесплатно. Урок в рамках старта курса «Java Developer. Professional».
🎯 О чём поговорим:
✔️ Разработка Kafka-продюсеров и консьюмеров на Java: шаблоны и анти-паттерны.
✔️ Работа со схемами данных: Avro, JSON-schema и интеграция со Schema Registry.
✔️ Управление версиями схем: совместимость, миграции и депрецирование.
✔️ Производительность и отказоустойчивость: настройки партиционирования, ретеншна и репликации.
✔️ Безопасность и мониторинг: аутентификация, авторизация и метрики Kafka.
👥 Кому будет интересно:
Java-разработчикам и архитектам, работающим с распределёнными системами, а также DevOps-инженерам, внедряющим Kafka в продакшен.
💡В результате урока вы:
— Освоите ключевые подходы к созданию надёжных Kafka-приложений на Java.
— Научитесь эффективно управлять схемами данных в Schema Registry и оптимизировать производительность ваших систем.
🎁 Дарим промокод, который дает скидку на обучение - JAVA_09
🔗 Ссылка на регистрацию: https://vk.cc/cOK2dx
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
🔍 Завтра тестовое собеседование с Java-разработчиком
20 августа (уже завтра!) в 19:00 по мск приходи онлайн на открытое собеседование, чтобы посмотреть на настоящее интервью на Middle Java-разработчика.
Как это будет:
📂 Сергей Чамкин, старший разработчик из Uzum, ex-WildBerries, будет задавать реальные вопросы и задачи разработчику-добровольцу
📂 Cергей будет комментировать каждый ответ респондента, чтобы дать понять чего от вас ожидает собеседующий на интервью
📂 В конце можно будет задать любой вопрос Сергею
Это бесплатно. Эфир проходит в рамках менторской программы от ШОРТКАТ для Java-разработчиков, которые хотят повысить свой грейд, ЗП и прокачать скиллы.
Переходи в нашего бота, чтобы получить ссылку на эфир → @shortcut_sh_bot
Реклама.
О рекламодателе.
Sealed Classes.
Sealed Classes — контроль наследования в Java 🔒
Одна из самых недооценённых фич Java 17 — sealed классы.
Если коротко: теперь ты можешь жёстко контролировать, кто именно может наследоваться от твоего класса.
До Java 17 🤯
Представь, у тебя есть базовый класс:
abstract class Shape {}
Circle, Rectangle, Triangle, StarShape, ShapeFromLegacyLib...
public sealed abstract class Shape
permits Circle, Rectangle, Triangle {}
Shape.final — дальше наследовать нельзя.
public final class Circle extends Shape {}
sealed — продолжаем ограничивать список наследников.
public sealed class Rectangle extends Shape
permits Square {}
non-sealed — снимаем ограничения, и от этого класса можно наследоваться свободно.
public non-sealed class Triangle extends Shape {}
switch с pattern matching: компилятор проверяет, что ты обработал все варианты.switch 💡
static String print(Shape shape) {
return switch (shape) {
case Circle c -> "Круг";
case Rectangle r -> "Прямоугольник";
case Triangle t -> "Треугольник";
};
}
Pattern Matching в switch.
Pattern Matching в switch — убийца if-else цепочек ⚔️
Ты наверняка видел такие простыни:
if (obj instanceof String) {
System.out.println("Строка длиной " + ((String) obj).length());
} else if (obj instanceof Integer) {
System.out.println("Целое число " + obj);
} else if (obj instanceof List) {
System.out.println("Список размером " + ((List<?>) obj).size());
} else {
System.out.println("Неизвестный тип");
}
switch:
switch (obj) {
case String s -> System.out.println("Строка длиной " + s.length());
case Integer i -> System.out.println("Целое число " + i);
case List<?> l -> System.out.println("Список размером " + l.size());
default -> System.out.println("Неизвестный тип");
}
else if простыней
switch (obj) {
case String s when s.length() > 5 ->
System.out.println("Длинная строка");
case String s ->
System.out.println("Короткая строка");
default ->
System.out.println("Что-то другое");
}
when — это guard condition.if-else, ручные касты.switch, никакой боли.switch с pattern matching, когда у тебя много разных подтипов или вход может быть разным типом.
⚙️ Микросервисы начинают тормозить под нагрузкой?
💡 Узнайте, как масштабировать и оптимизировать систему с помощью CQRS и Event Sourcing на .NET Aspire.
На открытом вебинаре «Оптимизация микросервисов с CQRS и Event Sourcing на .NET Aspire» 19 августа в 20:00 МСК разберем:
◽️ Ограничения классических микросервисов при высокой нагрузке.
◽️ Принципы разделения команд и запросов (CQRS) и хранения истории через Event Sourcing.
◽️ Практическую реализацию: сервис заказов с «команда-обработчик» и хранением событий в MongoDB.
◽️ Конфигурацию проекций для чтения данных.
❗️ Вы освоите оркестрацию через .NET Aspire (API Gateway, Order Service, база событий), внедрите логирование и трейсинг через OpenTelemetry, а также протестируете создание заказа, обновление статуса и визуализацию потока событий.
➡️ Посетите открытый урок и получите скидку на большое обучение «C# ASP.NET Core разработчик»: https://vk.cc/cOz6s4
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
☕ Совет дня по 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 ...
}
Подборка из 10 репозиториев GitHub для изучения Java
1. Awesome Java: https://github.com/akullpp/awesome-java
2. Modern Java - A Guide to Java 8: https://github.com/winterbe/java8-tutorial
3. Java Design Patterns: https://github.com/iluwatar/java-design-patterns
4. Spring Framework: https://github.com/spring-projects/spring-framework
5. Algorithms: https://github.com/TheAlgorithms/Java
6. Spring Boot Tutorial: https://github.com/RameshMF/spring-boot-tutorial
7. Baeldung Java and Spring Tutorials: https://github.com/eugenp/tutorials
8. Google Style Guides: https://github.com/google/styleguide
9. Netflix - Open Source Java Projects: https://github.com/Netflix
10. Ultimate Java Resources: https://github.com/dubesar/Ultimate-Java-Resources
👉@BookJava
Что такое «лямбда»? Какова структура и особенности использования лямбда-выражения?
Лямбда представляет собой набор инструкций, которые можно выделить в отдельную переменную и затем многократно вызвать в различных местах программы.
Основу лямбда-выражения составляет лямбда-оператор, который представляет стрелку ->. Этот оператор разделяет лямбда-выражение на две части: левая часть содержит список параметров выражения, а правая собственно представляет тело лямбда-выражения, где выполняются все действия.
Лямбда-выражение не выполняется само по себе, а образует реализацию метода, определенного в функциональном интерфейсе. При этом важно, что функциональный интерфейс должен содержать только один единственный метод без реализации.interface Operationable {
int calculate(int x, int y);
}
public static void main(String[] args) {
Operationable operation = (x, y) -> x + y;
int result = operation.calculate(10, 20);
System.out.println(result); //30
}
По факту лямбда-выражения являются в некотором роде сокращенной формой внутренних анонимных классов, которые ранее применялись в Java.
Отложенное выполнение (deferred execution) лямбда-выражения- определяется один раз в одном месте программы, вызываются при необходимости, любое количество раз и в произвольном месте программы.
Параметры лямбда-выражения должны соответствовать по типу параметрам метода функционального интерфейса:operation = (int x, int y) -> x + y;
//При написании самого лямбда-выражения тип параметров разрешается не указывать:
(x, y) -> x + y;
//Если метод не принимает никаких параметров, то пишутся пустые скобки, например:
() -> 30 + 20;
//Если метод принимает только один параметр, то скобки можно опустить:
n -> n * n;
Конечные лямбда-выражения не обязаны возвращать какое-либо значение.interface Printable {
void print(String s);
}
public static void main(String[] args) {
Printable printer = s -> System.out.println(s);
printer.print("Hello, world");
}
Блочные лямбда-выражения обрамляются фигурными скобками. В блочных лямбда-выражениях можно использовать внутренние вложенные блоки, циклы, конструкции if, switch, создавать переменные и т.д. Если блочное лямбда-выражение должно возвращать значение, то явным образом применяется оператор return:Operationable operation = (int x, int y) -> {
if (y == 0) {
return 0;
}
else {
return x / y;
}
};
Передача лямбда-выражения в качестве параметра метода:interface Condition {
boolean isAppropriate(int n);
}
private static int sum(int[] numbers, Condition condition) {
int result = 0;
for (int i : numbers) {
if (condition.isAppropriate(i)) {
result += i;
}
}
return result;
}
public static void main(String[] args) {
System.out.println(sum(new int[] {0, 1, 0, 3, 0, 5, 0, 7, 0, 9}, (n) -> n != 0));
}
👉@BookJava
🏗 Курс “Software Architect” от OTUS — старт набора в группу обучения
Если хотите проектировать отказоустойчивые и масштабируемые системы — этот курс для вас!
Почему стоит пойти:
• 100% практики на реальных проектах
• Проектирование гибких архитектур
• Микросервисы, интеграции, Big Data
• Современные паттерны: CQRS, Event Sourcing и др.
💡 Кому подойдёт:
• Разработчикам, готовым выйти на новый уровень
• Архитекторам, углубляющим экспертизу
• Тимлидам и менеджерам
✅После курса вы сможете:
• Проектировать масштабируемые архитектуры
• Оптимизировать взаимодействие сервисов
• Повышать качество и устойчивость систем
👉 Пройдите вступительное тестирование: https://vk.cc/cOLiuq
Совет по Java💡
При использовании Projections и QueryDSL, вместо того чтобы использовать Projections.constructor(Class type, Expression ...), можно добиться большей типобезопасности, применяя аннотации @QueryProjection и @QueryEntity. Таким образом, для вашей проекции будет сгенерирован типобезопасный QClass.
👉@BookJava
Как выполнять итерацию по коллекции в Java?
Коллекция в Java — это объект, который группирует несколько элементов в единое целое и является частью Java Collections Framework. Она часто используется для хранения, извлечения, обработки и передачи агрегированных данных.
Чтобы пройтись по коллекции, можно использовать цикл for-each, итератор или традиционный цикл for. Пример ниже показывает использование for-each и обычного цикла for:
// Example using for-each loop:
List<String> fruits = Arrays.asList("Apple", "Banana", "Orange");
for (String fruit : fruits) {
System.out.println(fruit);
}
// Example using regular for loop:
for (int i = 0; i < fruits.size(); i++) {
System.out.println(fruits.get(i));
}
Парсинг на Java. От основ до парсинга Яндекс Карт
Сегодня я рассмотрю основы парсинга на Java, используя как пример Яндекс Карты.
В этой статье мы рассмотрим, что такое HTTP и какие бывают методы запроса, как работать с HttpClient в Java 11+, как отправлять GET и POST-запросы, как обрабатывать HTTP-ответы и извлекать данные, и как всё это можно использовать для парсинга данных с внешнего сервера на примере Яндекс Карт.
https://habr.com/ru/companies/amvera/articles/937894/
👉 @BookJava
🔧 Сложности с масштабированием консьюмеров в RabbitMQ? Узнайте, как избежать ошибок, которые могут привести к потерям в порядке обработки сообщений.
📅 На открытом уроке 21 августа в 20:00 МСК разберём реальные кейсы и покажем, как правильно масштабировать консьюмеры, сохраняя порядок обработки. Узнаете, какие проблемы могут возникнуть при некорректном масштабировании и как их решить.
🎯 Получите ценные знания по прогнозированию и устранению проблем, повысите производительность системы и избегайте критических ошибок.
🚀 Зарегистрируйтесь на вебинар и получите в подарок записи трёх уроков по «Symfony», а также скидку на полный курс «Symfony Framework». Подарки доступны всем участникам! Регистрация по ссылке:
https://vk.cc/cOFmfT
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
Когда лучше использовать record, а когда class в Java.
Record vs Class в Java ☕️📦
С 2021-го в Java появилась новая зверушка - record.
Сначала все радовались: "О, меньше кода, equals/hashCode/constructor сами пишутся!" 🎉
А потом пошли странные вопросы в код-ревью:
"А почему у тебя тут record, а не class?"
"record же immutable, а ты тут мутируешь поле через рефлексию, ты что…"
record в Java — это особый вид final-класса с:equals, hashCode и toString из коробки.private final для каждого компонента.record - лучший выбор ✅
public record UserDto(String name, int age) {}
equals и hashCode генерятся честно и по всем полям - отличная стабильная ключевая структура.class лучше 🚫record тебе мешает: поля final, сеттеров нет.final. Забудь про расширение.record они просто не подружатся (даже если будут пытаться через магию).record будет ломаться при парсинге, потому что конструктор фиксирован.
public record Point(int x, int y) {
public double length() {
return Math.sqrt(x*x + y*y);
}
}
record).record - это не замена class, а инструмент для конкретных задач.
В чем разница между перегрузкой метода и переопределением метода в Java?
🧠 Перегрузка метода (Method Overloading)
Это когда в одном классе есть методы с одинаковым именем, но разными сигнатурами (количеством или типами параметров).
* Компилятор выбирает метод на этапе compile-time.
* Можно менять:
* количество параметров
* тип параметров
* порядок параметров
* Нельзя перегружать метод, меняя только возвращаемый тип.
💡 Пример:
public class MathUtil {
public int sum(int a, int b) { return a + b; }
public double sum(double a, double b) { return a + b; }
public int sum(int a, int b, int c) { return a + b + c; }
}
public / protected (не private).@Override.
class Animal {
public void makeSound() {
System.out.println("Some sound");
}
}
class Dog extends Animal {
@Override
public void makeSound() {
System.out.println("Woof!");
}
}
🚀 Хотите научиться интегрировать 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