Optional<T> —
Не стоит использовать
—
—
—
Стоит использовать:
#core
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🔥1👏1💯1
G1
Ключевые фазы
→
→
→
→
#core
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4❤1🔥1
PhantomReference —
Используется для
В отличие от finalize(), это надёжный способ отследить
#jvm
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7❤1🔥1👏1
WeakReference — это
Если на объект есть только weak references, GC может
WeakReference<Data> weak = new WeakReference<>(data);
data = null;
// GC может удалить объект
Data retrieved = weak.get(); // может вернуть null
Используется в
#jvm
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5❤1🔥1🤔1
This media is not supported in your browser
VIEW IN TELEGRAM
Включайте кружок там личное приглашение от спикера. 👆
Уже завтра в прямом эфире, разбираем архитектуру контекста в мультиагентных системах.
🤫 Секретный лут:
👉 Регистрируйтесь на трансляцию
Please open Telegram to view this post
VIEW IN TELEGRAM
Иммутабельный объект — это объект,
🤖 Осталось 4 места на курс по ИИ-агентам. Набор закрывается 30 апреля.
🔗 Успеть на обучение
#core
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3🔥2❤1
Многопоточность — это способность программы
Параллелизм, с другой стороны, — это
#concurrency
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥1👏1
Осталось всего 4 места на курс по ИИ-агентам. 30 апреля закрываем набор окончательно.
В ГС честно рассказали:
— Кому курс не подойдет;
— Какой хардкор в программе (LangGraph, AutoGen, CrewAI);
— Как мы даем токены, чтобы вы не тратили свои деньги.
🏃♀️ Записаться, пока есть места
В ГС честно рассказали:
— Кому курс не подойдет;
— Какой хардкор в программе (LangGraph, AutoGen, CrewAI);
— Как мы даем токены, чтобы вы не тратили свои деньги.
Please open Telegram to view this post
VIEW IN TELEGRAM
🌚1
@Conditional регистрирует бин только при
@Bean
@Conditional(WindowsCondition.class)
public Service windowsService() {
return new WindowsService();
}
class WindowsCondition implements Condition {
public boolean matches(ConditionContext context,
AnnotatedTypeMetadata metadata) {
return System.getProperty("os.name")
.contains("Windows");
}
}
Spring Boot предоставляет готовые: @ConditionalOnProperty, @ConditionalOnClass, @ConditionalOnMissingBean.
#spring
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4❤2🔥1
🔹 synchronized —
—
—
—
🔹 ReentrantLock
ReentrantLock lock = new ReentrantLock();
// Попытка без ожидания
if (lock.tryLock()) {
try {
// критическая секция
} finally {
lock.unlock(); // обязателен!
}
}
// С таймаутом
if (lock.tryLock(500, TimeUnit.MILLISECONDS)) { ... }
// С прерыванием
lock.lockInterruptibly();
🔹 Когда synchronized
🔹 Когда ReentrantLock
#concurrency
Please open Telegram to view this post
VIEW IN TELEGRAM
❤5👍3🔥1
Метод возвращает устаревшие данные. Иногда и только на нескольких потоках. Воспроизвести локально — нереально 👇
📦 Задание — code review
Команда добавила простой in-memory кэш для тяжёлых вычислений. На одном потоке работает идеально. На проде с нагрузкой — иногда возвращает старый результат или null.
@Component
public class PricingCache {
private final Map<String, BigDecimal> cache = new HashMap<>();
private final PricingEngine pricingEngine;
public PricingCache(PricingEngine pricingEngine) {
this.pricingEngine = pricingEngine;
}
public BigDecimal getPrice(String productId) {
if (cache.containsKey(productId)) {
return cache.get(productId);
}
BigDecimal price = pricingEngine.calculate(productId);
cache.put(productId, price);
return price;
}
public void invalidate(String productId) {
cache.remove(productId);
}
public void invalidateAll() {
cache.clear();
}
}
▪️ Объясни
— В чём проблема в коде
— Как переписать getPrice верно
Ставьте → 🔥, если нравится формат. Если нет → 🌚
#practise
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥10👍3❤1🤔1
HashMap —
Что происходит при put(key, value):
🔹 Коллизия:
До Java 8 →
С Java 8 →
// Упрощённо: Node в списке или TreeNode в дереве
static class Node<K,V> {
final int hash;
final K key;
V value;
Node<K,V> next;
}
🔹 Load factor и resize:
По умолчанию capacity =
Как только элементов стало больше
Поэтому если заранее знаете размер — задавайте начальную ёмкость:
// Хотим 1000 элементов без resize:
// 1000 / 0.75 ≈ 1334, берём следующую степень двойки
Map<String, Integer> map = new HashMap<>(2048);
#core
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8❤2🔥2
Strategy — это
Когда использовать:
—
—
—
Преимущества:
#patterns
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7❤3🔥2⚡1
Singleton — это
🔹 Основные характеристики:
—
—
—
🔹 Когда использовать:
—
—
—
—
#patterns
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4👍3🔥1
Adapter (Адаптер) — это
🔹 Когда использовать:
#patterns
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🔥1🤔1
Factory Method —
🔹 Когда использовать:
🔹 Как работает:
🔹 Плюсы:
—
—
—
#patterns
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6❤3🔥1
Abstract Factory — это
Простыми словами:
▪️ Пример:
// Абстрактные продукты
interface EmailSender {
void send(String to, String message);
}
interface SmsSender {
void send(String phone, String message);
}
// Абстрактная фабрика
interface NotificationFactory {
EmailSender createEmailSender();
SmsSender createSmsSender();
}
// AWS реализация
class AwsEmailSender implements EmailSender {
public void send(String to, String message) {
System.out.println("Отправка через AWS SES: " + to);
}
}
class AwsSmsSender implements SmsSender {
public void send(String phone, String message) {
System.out.println("Отправка через AWS SNS: " + phone);
}
}
class AwsNotificationFactory implements NotificationFactory {
public EmailSender createEmailSender() {
return new AwsEmailSender();
}
public SmsSender createSmsSender() {
return new AwsSmsSender();
}
}
// Аналогично FirebaseNotificationFactory...
// Использование
NotificationFactory factory = new AwsNotificationFactory();
EmailSender email = factory.createEmailSender();
SmsSender sms = factory.createSmsSender();
// Гарантия: оба сервиса работают через AWS
▪️ В чем отличие от Factory Method
— Factory Method создает
— Abstract Factory создает
▪️ Когда использовать
▪️ Минус
#patterns
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3👍2🔥1
🦾 Почему ваши AI-продукты на базе LLM ломаются (и как это чинить)?
Выкатили ИИ-фичу в прод, а она галлюцинирует, падает или выдает мусор? Приглашаем на открытый вебинар, где разберем реальную боль внедрения LLM-агентов и научимся делать так, чтобы «всё работало».
🗓 Когда: 14 мая в 19:00 МСК
⏱️ Формат: 60 минут мяса + 30 минут ответов на ваши вопросы
🧑🏻💻 Кто вещает: Эмиль Сатаев — Backend Platform Developer (8+ лет в разработке). Человек, который своими руками внедряет LLM и агентные системы в реальные коммерческие сервисы.
🎁 Главный бонус для онлайна:
Только участникам прямого эфира подарим уникальный промокод на скидку 10.000 ₽ на большой курс AgentOps.
👉 Занять место на вебинаре
Выкатили ИИ-фичу в прод, а она галлюцинирует, падает или выдает мусор? Приглашаем на открытый вебинар, где разберем реальную боль внедрения LLM-агентов и научимся делать так, чтобы «всё работало».
🗓 Когда: 14 мая в 19:00 МСК
⏱️ Формат: 60 минут мяса + 30 минут ответов на ваши вопросы
🧑🏻💻 Кто вещает: Эмиль Сатаев — Backend Platform Developer (8+ лет в разработке). Человек, который своими руками внедряет LLM и агентные системы в реальные коммерческие сервисы.
🎁 Главный бонус для онлайна:
Только участникам прямого эфира подарим уникальный промокод на скидку 10.000 ₽ на большой курс AgentOps.
👉 Занять место на вебинаре
@Transactional стоит, исключение летит. Данные в БД остаются. Почему?
📦 Задание — code review
Команда добавила транзакцию на метод сохранения заказа. При ошибке валидации данные всё равно коммитятся в базу. @Transactional на месте, но не работает.
public class CheckedBusinessException extends Exception {
public CheckedBusinessException(String message) {
super(message);
}
}
@Service
public class OrderService {
private final OrderRepository orderRepository;
private final InventoryService inventoryService;
@Transactional
public void placeOrder(Order order) throws CheckedBusinessException {
orderRepository.save(order);
inventoryService.reserveStock(order);
}
}
@Service
public class InventoryService {
public void reserveStock(Order order) throws CheckedBusinessException {
if (order.getQuantity() > availableStock) {
throw new CheckedBusinessException("Not enough stock");
}
}
}▪️ Почему @Transactional не откатывает изменения при CheckedBusinessException?
▪️ Как добиться rollback в этом коде
Ставьте → 🔥, если нравится формат. Если нет → 🌚
#practise
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥7❤3👍2
Prototype — это
Простыми словами: вместо создания объекта с нуля через конструктор, вы клонируете уже существующий экземпляр.
▪️ Пример:
// Прототип
abstract class Report implements Cloneable {
protected String template;
protected DatabaseConnection dbConnection;
protected Map<String, Object> settings;
// Сложная инициализация
public Report() {
this.dbConnection = new DatabaseConnection(); // затратная операция
this.settings = loadDefaultSettings(); // загрузка из файла
}
@Override
public Report clone() {
try {
Report cloned = (Report) super.clone();
// Глубокое копирование для изменяемых полей
cloned.settings = new HashMap<>(this.settings);
return cloned;
} catch (CloneNotSupportedException e) {
throw new RuntimeException(e);
}
}
abstract void generate();
}
class SalesReport extends Report {
void generate() {
System.out.println("Генерация отчета по продажам");
}
}
// Использование
Report prototype = new SalesReport(); // долгая инициализация
// Быстрое создание копий
Report report1 = prototype.clone();
Report report2 = prototype.clone();
report2.settings.put("period", "Q2"); // изменяем только нужные параметры
▪️ Когда использовать
—
—
—
▪️ Важно: Shallow vs Deep Copy
Shallow copy — копируются только примитивы, ссылки на объекты остаются теми же
Deep copy — создаются копии вложенных объектов
▪️ Альтернативы clone()
— Copy constructor: new Report(original)
— Статический метод: Report.copy(original)
— Сериализация: для очень сложных объектов
▪️ Минус
#patterns
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4❤1🔥1