Какова цель ключевого слова final, когда оно используется с переменной?
Ключевое слово final в Java — это модификатор, который может применяться к переменным, методам и классам. Когда оно используется с переменной, это делает её неизменяемой, другими словами — константой. Например, переменная PI объявлена как final в классе ниже:
👉 @java_geek
Ключевое слово final в Java — это модификатор, который может применяться к переменным, методам и классам. Когда оно используется с переменной, это делает её неизменяемой, другими словами — константой. Например, переменная PI объявлена как final в классе ниже:
public class CircleCalculator {
private final double PI = 3.14159;
public double calculateArea(double radius) {
return PI * radius * radius;
}
}
👉 @java_geek
👍4
Class.getRecordComponents()
👉 @java_geek
Class.getRecordComponents()
возвращает информацию о компонентах записи (record). Это полезно для рефлексии, сериализации и автоматического отображения данных в Record-классах.👉 @java_geek
👍2❤1
Лучший способ вырасти — это персональный план развития от Senior-инженера из БигТеха.
Вот как все работает:
Мы в ШОРТКАТ провели уже почти 1000 таких мок-интервью и получили оценку 4.9/5, поэтому знаем о чем говорим.
Мы хотим, чтобы у каждого была возможность проверить в деле наш сервис, а потом уже доверить нам свое развитие.
Переходи в нашего бота и забирай свой мок за 900 рублей → @shortcut_sh_bot
Реклама.
О рекламодателе.
Please open Telegram to view this post
VIEW IN TELEGRAM
🤡1
Как прогреть кэши в Spring Boot, чтобы убрать «холодный старт»
🧠 Идея простая: не лезьте напрямую в
📌 Минимальная реализация (Boot 3+, Java 17/21)
💡 Где брать «горячие» ключи:
топ-N по обращениями за последние 24–72 часа (лог/метрики);
статические справочники (страны, тарифы);
ключи, которые дергают критичные эндпоинты / главная страница.
⚠️ Важные нюансы:
Не блокируйте старт сервиса надолго. Делайте прогрев асинхронно и с лимитом параллельных задач (Semaphore/FixedThreadPool).
Падения прогрева ≠ падения приложения. Оберните в try/catch, логируйте, но не валите контекст.
Health/Readiness. Если нужен «строгий» запуск, проверяйте готовность только по минимальному набору ключей, а остальное догревайте фоном.
Кластеры. В Redis/общем кеше греть можно с одного инстанса (feature-flag), чтобы не дублировать трафик. В локальных (Caffeine) - грейте на каждом.
Обновление после прогрева. Для данных, которые быстро стареют, добавьте
👉 @java_geek
🧠 Идея простая: не лезьте напрямую в
CacheManager
. Прогревайте через те же @Cacheable
методы, которые используются в рантайме - так вы не обходите unless
, ключи и TTL провайдера.📌 Минимальная реализация (Boot 3+, Java 17/21)
// Сервис с кэшем
@Service
public class CatalogService {
@Cacheable(cacheNames = "products", key = "#id", unless = "#result == null")
public Product getById(Long id) {
// дорогой вызов в БД/REST
}
}
// Прогрев после полной готовности приложения
@Component
@RequiredArgsConstructor
public class CacheWarmup {
private final CatalogService catalog;
@EventListener(org.springframework.boot.context.event.ApplicationReadyEvent.class)
public void warm() {
if (!isEnabled()) return;
var hotIds = loadHotProductIds(); // топ-ключи из БД/конфига
try (var exec = java.util.concurrent.Executors.newVirtualThreadPerTaskExecutor()) {
// ограничьте параллелизм при необходимости (Semaphore)
hotIds.stream()
.map(id -> java.util.concurrent.CompletableFuture.supplyAsync(() -> catalog.getById(id), exec))
.forEach(java.util.concurrent.CompletableFuture::join);
}
}
private boolean isEnabled() { return true; } // читайте из настроек/профиля
private List<Long> loadHotProductIds() { return List.of(1L,2L,3L,4L,5L); }
}
application.yml
:
spring:
cache:
type: caffeine
cache-names: products
caffeine:
spec: maximumSize=10000,expireAfterWrite=1h,recordStats
# Быстрый прогрев без блокировки потоков ОС (Java 21+)
spring.threads.virtual.enabled: true
💡 Где брать «горячие» ключи:
топ-N по обращениями за последние 24–72 часа (лог/метрики);
статические справочники (страны, тарифы);
ключи, которые дергают критичные эндпоинты / главная страница.
⚠️ Важные нюансы:
Не блокируйте старт сервиса надолго. Делайте прогрев асинхронно и с лимитом параллельных задач (Semaphore/FixedThreadPool).
Падения прогрева ≠ падения приложения. Оберните в try/catch, логируйте, но не валите контекст.
Health/Readiness. Если нужен «строгий» запуск, проверяйте готовность только по минимальному набору ключей, а остальное догревайте фоном.
Кластеры. В Redis/общем кеше греть можно с одного инстанса (feature-flag), чтобы не дублировать трафик. В локальных (Caffeine) - грейте на каждом.
Обновление после прогрева. Для данных, которые быстро стареют, добавьте
@Scheduled
обновление (@CacheEvict
/@CachePut
) или фоновые рефреши.👉 @java_geek
👍3
Array vs ArrayList
Выбор между Array (стандартным Java-массивом) и ArrayList зависит от специфики задачи на Java, которую требуется решить. Помните о следующих особенностях этих типов:
☕️ Array имеет фиксированный размер и память для него выделяется в момент объявления, а размер ArrayList может динамически изменяться;
☕️ Массивы Java работают гораздо быстрее, а в ArrayList намного проще добавлять/удалять элементы;
☕️ При работе с Array велика вероятность получить ошибку ArrayIndexOutOfBoundsException;
☕️ У ArrayList только одно измерение, а вот массивы Java могут быть многомерными.
👉 @java_geek
Выбор между Array (стандартным Java-массивом) и ArrayList зависит от специфики задачи на Java, которую требуется решить. Помните о следующих особенностях этих типов:
☕️ Array имеет фиксированный размер и память для него выделяется в момент объявления, а размер ArrayList может динамически изменяться;
☕️ Массивы Java работают гораздо быстрее, а в ArrayList намного проще добавлять/удалять элементы;
☕️ При работе с Array велика вероятность получить ошибку ArrayIndexOutOfBoundsException;
☕️ У ArrayList только одно измерение, а вот массивы Java могут быть многомерными.
👉 @java_geek
👍4❤2
Можно ли перегружать метод main() в Java?
Да, метод
👉 @java_geek
Да, метод
main()
может быть перегружен, но JVM или виртуальная машина Java вызывает только исходный метод main()
.👉 @java_geek
👍6
Что такое стек-трейс?
Стек-трейс (stack trace) представляет собой список вызовов методов в обратном хронологическом порядке, начиная с метода, в котором произошло исключение. Стек-трейс позволяет отследить, какие методы были вызваны перед возникновением исключения, и предоставляет информацию о местоположении, где произошло исключение.
👉 @java_geek
Стек-трейс (stack trace) представляет собой список вызовов методов в обратном хронологическом порядке, начиная с метода, в котором произошло исключение. Стек-трейс позволяет отследить, какие методы были вызваны перед возникновением исключения, и предоставляет информацию о местоположении, где произошло исключение.
👉 @java_geek
👍3
Какая проблема возникнет с этим кодом?
Ответ: Данный код не с компилируется.
Этот вопрос на знание иерархии исключений, в данном случае
👉 @java_geek
Ответ: Данный код не с компилируется.
Этот вопрос на знание иерархии исключений, в данном случае
FileNotFoundException
унаследован от IOException
, первый catch
будет перехватывать все исключения и в следующий блок catch
управление не будет передано.👉 @java_geek
👍2❤1
17 сентября(уже завтра!) в 19:00 по мск приходи онлайн на открытое собеседование, чтобы посмотреть на настоящее интервью на Middle Java-разработчика.
Как это будет:
Это бесплатно. Эфир проходит в рамках менторской программы от ШОРТКАТ для Java-разработчиков, которые хотят повысить свой грейд, ЗП и прокачать скиллы.
Переходи в нашего бота, чтобы получить ссылку на эфир → @shortcut_sh_bot
Реклама.
О рекламодателе.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2👎1
Можно ли указывать конструктор внутри Enum?
Да, конечно. Именно через конструктор и задаются значения внутренних переменных enum.
В качестве примера добавим два поля -
👉 @java_geek
В качестве примера добавим два поля -
ageFrom
и ageTo
- чтобы обозначить возрастные рамки для каждой роли.👉 @java_geek
👍2
📕 Архитектура и написание backend тестов для разработчиков Java, QA инженеров, автоматизаторов, QA Lead и DevOps-специалистов
На открытом уроке 17 сентября в 20:00 мск мы погрузимся в тонкости построения архитектуры надежных и понятных backend-тестов:
📗 На вебинаре разберём:
1. Использование Java и RestAssured для API-тестирования, приёмы структурирования и переиспользования кода.
2. Архитектурные принципы построения надёжных тестов.
📘 В результате на практике освоите построение надежных backend-тестов, научитесь писать чистый, гибкий и поддерживаемый код на Java с RestAssured и получите архитектурные шаблоны и рабочие примеры для своих проектов.
👉 Регистрация и подробности о курсе Java QA Engineer. Professional: https://vk.cc/cPz94k
Все участники открытого урока получат скидку на курс "Java QA Engineer. Professional"
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
На открытом уроке 17 сентября в 20:00 мск мы погрузимся в тонкости построения архитектуры надежных и понятных backend-тестов:
📗 На вебинаре разберём:
1. Использование Java и RestAssured для API-тестирования, приёмы структурирования и переиспользования кода.
2. Архитектурные принципы построения надёжных тестов.
📘 В результате на практике освоите построение надежных backend-тестов, научитесь писать чистый, гибкий и поддерживаемый код на Java с RestAssured и получите архитектурные шаблоны и рабочие примеры для своих проектов.
👉 Регистрация и подробности о курсе Java QA Engineer. Professional: https://vk.cc/cPz94k
Все участники открытого урока получат скидку на курс "Java QA Engineer. Professional"
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576