Залетел полезняк для тех, кто готовится к собесам по Java или просто хочет быстро освежить базу.
На InterviewPrep выложили Java Notes (по сути мини-гайд/конспект) и там закрывают самые частые темы:
Можно прям как чеклист прогнать перед интервью.
👉 Java Portal
На InterviewPrep выложили Java Notes (по сути мини-гайд/конспект) и там закрывают самые частые темы:
история Java
JDK / JRE / JVM (как это вообще устроено)
Collections
управление памятью
многопоточность
обработка исключений
типы классов
типы данных и ключевые слова
Можно прям как чеклист прогнать перед интервью.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤11👍7
В Spring Boot можно задать таймаут для graceful shutdown через настройку spring.lifecycle.timeout-per-shutdown-phase.
Graceful shutdown помогает избежать резких обрывов HTTP-запросов и преждевременных остановок потоков.
👉 Java Portal
Graceful shutdown помогает избежать резких обрывов HTTP-запросов и преждевременных остановок потоков.
server:
shutdown: graceful
spring:
lifecycle:
timeout-per-shutdown-phase: 20s
# Сервер будет завершаться корректно (graceful).
# Даёт до 20 секунд на завершение запросов и работы бинов.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6
Про модификаторы доступа в Java (public / default / protected / private)
private - только для себя
public - откуда угодно
protected - вроде бы для подклассов?
На самом деле тут всегда начинается каша, если не смотреть на вопрос "откуда и кто вызывает" по двум осям: пакет и наследование.
Чтобы нормально понять модификаторы, я подумал: пусть будет статья с моделью "якинику-ресторан".
Что такое модификаторы на самом деле:
Модификаторы - это не про "силу".
Это правила, откуда можно получить доступ.
В Java доступ всегда определяется двумя вещами:
* тот же пакет?
* есть наследование?
Модель с рестораном якинику:
* YakinikuShop: сам ресторан (родительский класс)
* LocalStaff: персонал этого же ресторана
* Manager: управляющий (дочерний класс)
* BranchStaff: персонал филиала (другой пакет + наследник)
* Customer: обычный клиент
Родительский класс: YakinikuShop.java
Почему askManagerToOpenSafe "особенный"
askManagerToOpenSafe - public.
То есть вызвать его может кто угодно.
Но откроется сейф или нет - решает проверка instanceof внутри.
public != "можно всё"
public = "вход виден и доступен"
Суть public вот такая:
*✅ может вызвать клиент
*✅ может вызвать персонал
*✅ может вызвать кто-то из другого магазина
"Встать у входа и попросить" можно, но:
*❌ если ты не управляющий - тебя сразу разворачивают
*❌ private-сейф напрямую трогать нельзя
Таблица доступа:
Клиент:
public:✅
default:❌
protected:❌
private:❌
Персонал этого же ресторана (тот же пакет):
public:✅
default:✅
protected:✅
private:❌
Персонал филиала (другой пакет, но наследник):
public:✅
default:❌
protected:✅
private:❌
Управляющий (дочерний класс):
public:✅
default:✅
protected:✅
private:❌
Сам класс YakinikuShop:
public:✅
default:✅
protected:✅
private:✅
👉 Java Portal
private - только для себя
public - откуда угодно
protected - вроде бы для подклассов?
На самом деле тут всегда начинается каша, если не смотреть на вопрос "откуда и кто вызывает" по двум осям: пакет и наследование.
Чтобы нормально понять модификаторы, я подумал: пусть будет статья с моделью "якинику-ресторан".
Что такое модификаторы на самом деле:
Модификаторы - это не про "силу".
Это правила, откуда можно получить доступ.
В Java доступ всегда определяется двумя вещами:
* тот же пакет?
* есть наследование?
Модель с рестораном якинику:
* YakinikuShop: сам ресторан (родительский класс)
* LocalStaff: персонал этого же ресторана
* Manager: управляющий (дочерний класс)
* BranchStaff: персонал филиала (другой пакет + наследник)
* Customer: обычный клиент
Родительский класс: YakinikuShop.java
package shop;
public class YakinikuShop {
public int counter = 30; // Стойка/места: видно всем
int staffRoom = 10; // Комната персонала: только для своего пакета
protected int kitchen = 20; // Кухня: свой пакет или наследники
private int safeMoney = 100; // Сейф: даже управляющему напрямую нельзя
public void askManagerToOpenSafe(Object person) {
if (!(person instanceof Manager)) {
System.out.println("❌ Только управляющий может открыть сейф");
return;
}
openSafe();
}
private void openSafe() {
System.out.println("open safe: " + safeMoney);
}
}
Почему askManagerToOpenSafe "особенный"
askManagerToOpenSafe - public.
То есть вызвать его может кто угодно.
Но откроется сейф или нет - решает проверка instanceof внутри.
public != "можно всё"
public = "вход виден и доступен"
Суть public вот такая:
*
*
*
"Встать у входа и попросить" можно, но:
*
*
Таблица доступа:
Клиент:
public:
default:
protected:
private:
Персонал этого же ресторана (тот же пакет):
public:
default:
protected:
private:
Персонал филиала (другой пакет, но наследник):
public:
default:
protected:
private:
Управляющий (дочерний класс):
public:
default:
protected:
private:
Сам класс YakinikuShop:
public:
default:
protected:
private:
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔7🔥4👍2
Spring Boot: используй CommandLineRunner, чтобы выполнять логику при старте приложения.
CommandLineRunner это интерфейс Spring Boot. Его можно реализовать, чтобы запускать код после того, как контекст приложения полностью инициализирован.
Некоторые сценарии, где это уместно:
Заполнение БД начальными данными
Запуск health-check’ов при старте
Бутстрап внешних сервисов/ресурсов
Пример:
👉 Java Portal
CommandLineRunner это интерфейс Spring Boot. Его можно реализовать, чтобы запускать код после того, как контекст приложения полностью инициализирован.
Некоторые сценарии, где это уместно:
Заполнение БД начальными данными
Запуск health-check’ов при старте
Бутстрап внешних сервисов/ресурсов
Пример:
@Component
public class StartupRunner implements CommandLineRunner {
@Override
public void run(String... args) {
System.out.println("Приложение запущено! Дальнейшая настройка");
}
}
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12
Please open Telegram to view this post
VIEW IN TELEGRAM
❤33🔥11👍4🤣2🏆1
Spring Boot: чтобы при сериализации в Jackson исключать любые поля, у которых значение null, можно использовать аннотацию
Все пустые поля исключаются автоматически.
👉 Java Portal
@JsonInclude(Include.NON_NULL)@JsonInclude(JsonInclude.Include.NON_NULL)
public class UserDTO {
private Long id;
private String name;
private String email;
private String phone;
...
}
Все пустые поля исключаются автоматически.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7❤3🤔2
Spring Boot: на этапе разработки используй spring.main.lazy-initialization=true, чтобы ускорить старт приложения.
По умолчанию Spring Boot жадно инициализирует все бины на старте. В дев-окружении это значит:
1. Дольше стартует, особенно в больших проектах
2. Приходится ждать загрузки бинов, которые тебе прямо сейчас не нужны
Чтобы этого избежать, в
Но в проде важно оставить дефолтное поведение, потому что:
1. Ошибки старта ловятся раньше
2. Все компоненты сразу готовы принимать запросы
👉 Java Portal
По умолчанию Spring Boot жадно инициализирует все бины на старте. В дев-окружении это значит:
1. Дольше стартует, особенно в больших проектах
2. Приходится ждать загрузки бинов, которые тебе прямо сейчас не нужны
Чтобы этого избежать, в
application.properties поставь:spring.main.lazy-initialization=true
Но в проде важно оставить дефолтное поведение, потому что:
1. Ошибки старта ловятся раньше
2. Все компоненты сразу готовы принимать запросы
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4❤3
This media is not supported in your browser
VIEW IN TELEGRAM
Сommand completion (..) расширяет обычный code completion. Помимо автодополнения API и postfix completion, автодополнение кода теперь включает и команды. Чтобы отфильтровать список только до команд, используйте
👉 Java Portal
.. Список поддерживает поиск, чтобы быстрее находить нужное.Please open Telegram to view this post
VIEW IN TELEGRAM
❤1
Java tip : старайся не шарить данные между потоками.
✅ Используй immutable-объекты
✅ Или пусть потоки общаются сообщениями, не лезя напрямую в общий state и не мутируя его
👉 Java Portal
// With immutable objects:
record Book(String title, int price) {} //Immutable
public class BookJob implements Runnable {
private final Book book;
....//constructor
@Override
public void run() {
System.out.println(book.title() + " " + book.price());
}
}
// Exchanging messages:
...
new Thread(() -> {
try {
queue.put("mess1");
} catch (InterruptedException e) {}
}).start();
...
new Thread(() -> {
try {
String mess = queue.take();
} catch (InterruptedException e) {}
}).start();
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
10 золотых правил чистого кода:
1. Избегай магических чисел и строк
2. Используй осмысленные, говорящие имена
3. Предпочитай ранние
4. Избегай длинных списков параметров
5. Делай функции маленькими и сфокусированными
6. Соблюдай DRY (Don’t Repeat Yourself) — не дублируй код
7. Применяй принцип KISS (Keep It Simple, Stupid) — делай проще
8. Отдавай предпочтение композиции, а не наследованию
9. Комментируй только там, где это действительно необходимо
10. Пиши хорошие сообщения к коммитам
Какие еще правила чистого кода ты бы добавил в этот список?
👉 Java Portal
1. Избегай магических чисел и строк
2. Используй осмысленные, говорящие имена
3. Предпочитай ранние
return вместо глубокой вложенности4. Избегай длинных списков параметров
5. Делай функции маленькими и сфокусированными
6. Соблюдай DRY (Don’t Repeat Yourself) — не дублируй код
7. Применяй принцип KISS (Keep It Simple, Stupid) — делай проще
8. Отдавай предпочтение композиции, а не наследованию
9. Комментируй только там, где это действительно необходимо
10. Пиши хорошие сообщения к коммитам
Какие еще правила чистого кода ты бы добавил в этот список?
Please open Telegram to view this post
VIEW IN TELEGRAM
👍19🔥4
Совет по Java: если нужна максимально хорошая производительность в общем случае, бери HashMap как реализацию Map.
✅
🪲 Он не потокобезопасный (если нужна thread-safety, используй
Пример:
👉 Java Portal
HashMap внутри реализован как хеш-таблица, и в среднем put(), get() и remove() работают за O(1).ConcurrentHashMap).Пример:
Map<String, Integer> ages = new HashMap<>();
// Добавляем данные
ages.put("Michael", 31);
ages.put("Lisa", 25);
ages.put("Alice", 42);
// Поиск
System.out.println("Возраст Lisa: " + ages.get("Lisa"));
// Удаление
ages.remove("Alice");
// Итерация
for (Map.Entry<String, Integer> entry : ages.entrySet()) {
System.out.println(entry.getKey() + ": " + entry.getValue());
}
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9❤4💊1
На Stepik вышел курс по Linux
Этот курс закрывает всю обязательную Linux-базу для работы в IT: от установки Linux и работы с файлами до сетей, прав, дисков, процессов, автоматизации на Bash и многого другого. Всё сразу закрепляется на практике (200+ заданий с автопроверкой)
Материал подаётся понятным языком, шаг за шагом, на реальных примерах и с наглядными схемами
После прохождения вы получите сертификат, который можно добавить в резюме.
Есть бесплатные демо-уроки для ознакомления. В ближайшие 48ч курс доступен со скидкой 25% по промокоду «
Этот курс закрывает всю обязательную Linux-базу для работы в IT: от установки Linux и работы с файлами до сетей, прав, дисков, процессов, автоматизации на Bash и многого другого. Всё сразу закрепляется на практике (200+ заданий с автопроверкой)
Материал подаётся понятным языком, шаг за шагом, на реальных примерах и с наглядными схемами
После прохождения вы получите сертификат, который можно добавить в резюме.
Есть бесплатные демо-уроки для ознакомления. В ближайшие 48ч курс доступен со скидкой 25% по промокоду «
POST25»: открыть курс на Stepik❤1
This media is not supported in your browser
VIEW IN TELEGRAM
Если ты изучаешь Java или хочешь прокачать навыки, обрати внимание на JBook — это интерактивная книга по Java, доступная прямо на GitHub.
Что внутри:
🔸 Подробное объяснение основ языка Java;
🔸 Примеры кода с пояснениями;
🔸 Упражнения для закрепления знаний;
🔸 Поддержка Jupyter Notebook + Java (IJava kernel) — можно запускать код прямо в браузере
GitHub: https://github.com/qcha/JBook
👉 Java Portal
Что внутри:
GitHub: https://github.com/qcha/JBook
Please open Telegram to view this post
VIEW IN TELEGRAM
❤5🔥3