Кроссовки The North Face Glenclyffe Gore-Tex
STYLAR: брендовая одежда, обувь и аксессуары
✅ Премиальные бренды, которые ты знаешь — без лишних наценок и напрямую от поставщиков. Работаем уже более 5 лет!
⚡ EA7, Burberry, Tom Ford, Premiata, Moncler, Chrome Hearts, Loro Piana, Prada, Brunello Cucinelli, Hugo Boss, LV, Tommy Hilfiger, D&G, Polo Ralph Lauren, Hermes и др.
🚗 Доставка с примеркой по Москве, в другие города России и СНГ — быстро, надёжно и без задержек.
💰 Скидки до -80% в нашем дисконт Telegram-канале.
❤️ Тысячи моделей в наличии, новинки каждый день — без переплат и лишней суеты!
Смотреть
#реклама
О рекламодателе
Отличная шпаргалка для разработчиков, которые регулярно работают с Git.
Создание коммитов, переключение между ветками, разрешение конфликтов, отмена изменений, работа с удалёнными репозиториями и история проекта.
80 команд с короткими пояснениями и примерами.
Полезные ресурсы по Java 👩💻| Наш канал в MAX 🟪
Почувствуйте ритм Дубая с отелями Jumeirah
Семейный отдых обретает свой ритм - время для открытий, игр и особенных моментов вместе.
Узнать больше
#реклама
jumeirah.com
О рекламодателе
Не отправляйте null-поля в JSON — используйте @JsonInclude(NON_NULL).
Исключает из ответа свойства, значение которых равно null.
Делает JSON чище для клиентов и уменьшает размер ответа.
Аннотацию можно добавить к классу или отдельному полю, а также настроить глобально через Jackson.
Полезные ресурсы по Java 👩💻| Наш канал в MAX 🟪
Бесплатный ИИ без ВПН - beeGPT!
Удобный помощник в твоём кармане:
-Поможет спланировать отпуск👌
-Объяснит сложную тему👌
-Поможет найти рецепт👌
...и другое - под все твои задачи!
⚡Попробуй по ссылке⚡
Убрать фон у картинки
Сгенерировать видео-открытку
Перевести текст
Узнать что-то новое
Используй уже сегодня - доступно для всех!
beeGPT
Узнать больше
#реклама 16+
beeline.ru
О рекламодателе
Объектно-ориентированное программирование (ООП) - это парадигма программирования, которая базируется на концепции "объектов". Она предоставляет способ организации кода, который позволяет разрабатывать более модульные, масштабируемые и легко поддерживаемые программы. Основными концепциями ООП являются классы, объекты, инкапсуляция, наследование и полиморфизм. Вот более подробное описание этих концепций:
Классы и объекты: Класс - это шаблон или чертеж, описывающий структуру и поведение объекта. Объект - это экземпляр класса, который содержит данные и методы, определенные в этом классе. Классы служат для определения объектов, а объекты - для создания конкретных экземпляров.
Инкапсуляция: Инкапсуляция - это механизм, который позволяет скрыть внутренние детали реализации класса от внешнего мира и предоставлять доступ только к необходимым данным и методам. Это делается с помощью модификаторов доступа, таких как private, protected и public.
Наследование: Наследование позволяет создавать новые классы на основе существующих классов, наследуя их свойства и методы. Это способствует повторному использованию кода и созданию иерархии классов. Родительский класс называется базовым классом, а наследующий класс - производным.
Полиморфизм: Полиморфизм означает способность объектов разных классов реагировать на одну и ту же операцию по-разному. Это может быть достигнуто с помощью перегрузки операторов, абстрактных классов и интерфейсов. Полиморфизм позволяет упростить обработку объектов разных типов и сделать код более гибким.
ООП способствует разделению ответственности в программе, облегчает ее сопровождение и расширение, а также повышает повторное использование кода. Часто используется в разработке больших и сложных приложений, где необходимо управлять множеством объектов и их взаимодействием. Популярные языки программирования, поддерживающие ООП, включают Java, C++, C#, Python, и многие другие.
Полезные ресурсы по Java 👩💻| Наш канал в MAX 🟪
Техника Braun для красоты и ухода со скидкой до 55%
✅ Оригинальные бритвы, триммеры и эпиляторы
✅ Точность, комфорт и стиль — вместе с Braun
Купить
#реклама
market.yandex.ru
О рекламодателе
Хеширование vs шифрование vs кодирование
Эти три понятия часто путают в разработке. Все они могут преобразовывать данные в другое представление, но предназначены для совершенно разных задач.
Главный вопрос: что вы хотите сделать — проверить данные, защитить их или просто изменить способ их представления?
Короткая шпаргалка:
• Hashing (хеширование) → преобразование в одну сторону.
• Encryption (шифрование) → обратимое преобразование с помощью ключа.
• Encoding (кодирование) → обратимое преобразование без секретного ключа.
1. Хеширование (Hashing). Хеширование преобразует входные данные в хеш фиксированной длины.
Вход: Hello123
↓
SHA-256
↓
Хеш: 64-символьное шестнадцатеричное значение
Пример на Java:
MessageDigest digest = MessageDigest.getInstance("SHA-256");
byte[] hash = digest.digest(
"Hello123".getBytes(StandardCharsets.UTF_8)
);
Практически невозможно восстановить исходные данные из надёжного криптографического хеша.
Где используется:
• Проверка целостности данных.
• Хранение паролей (с помощью специализированных алгоритмов хеширования паролей).
• Цифровые подписи.
• Проверка файлов.
Для хранения паролей следует использовать Argon2id, bcrypt, scrypt или PBKDF2 с подходящими солью и параметрами, а не обычный SHA-256.
Запомните: можно ли проверить данные, не восстанавливая оригинал?
2. Шифрование (Encryption). Шифрование преобразует читаемые данные в зашифрованный текст с помощью криптографического ключа.
Исходный текст
↓
Шифрование + ключ
↓
Шифротекст
↓
Расшифровка + ключ
↓
Исходный текст
Например:
Вход: AccountNumber123
Выход: Зашифрованный текст
С правильным ключом исходные данные можно восстановить.
Где используется:
• Защита конфиденциальных данных.
HTTPS/TLS.
• Шифрование баз данных.
• Безопасная передача информации.
• Защита файлов.
Запомните: данные должны оставаться секретными, но при необходимости их можно восстановить.
3. Кодирование (Encoding). Кодирование преобразует данные в другое представление. Это не механизм обеспечения безопасности.
Вход: Hello
↓
Base64 Encoding
↓
SGVsbG8=
↓
Base64 Decoding
↓
Hello
Пример на Java:
String encoded = Base64.getEncoder()
.encodeToString("Hello".getBytes());
String decoded = new String(
Base64.getDecoder().decode(encoded)
);
Где используется:
• Base64.
• URL-кодирование.
• Форматы сериализации данных.
• Передача бинарных данных в текстовом виде.
Запомните: меняется представление данных, а не уровень их защиты.
Распространённые заблуждения:
• Base64 — это шифрование.
• Хеширование — это шифрование.
• Зашифрованные данные невозможно расшифровать.
• SHA-256 сам по себе подходит для хранения паролей.
Всё это неверно.
Пример из реальной разработки: Представим, что нужно сохранить пароль пользователя:
MySecret123
• Хеширование: сохраняем надёжный хеш пароля и используем его для проверки при входе.
• Шифрование: защищаем данные, которые в дальнейшем потребуется расшифровать.
• Кодирование: преобразуем данные в формат, удобный для передачи.
Главное, что нужно запомнить:
• Hashing → Проверить.
• Encryption → Защитить.
• Encoding → Представить.
Если нужна конфиденциальность — используйте шифрование. Если нужно проверить целостность — хеширование. Если требуется изменить представление данных — кодирование.
Полезные ресурсы по Java 👩💻| Наш канал в MAX 🟪
Российские ученые изобрели гаджет от бессонницы
Инновационный безопасный гаджет для здорового сна - кубик сна Deep. Поможет быстрее уснуть, глубже спать и легче просыпаться с помощью запатентованной технологии низкочастотных импульсов электромагнитного поля.
Одобрено РАН, 1 месяц на тест, больше 40 000 пользователей по всему миру.
В нашем Telegram-канале рассказываем, как это устроено, что говорят исследования и почему тысячи людей уже используют Deep.
Подписывайтесь и открывайте новые возможности своего сна!
Подписаться
#реклама
О рекламодателе
🖥 EnvironmentPostProcessor задаёт общие настройки Spring Boot из стартера
Внутренний Spring Boot-стартер может поставлять общие настройки Jackson, логирования или Actuator. При этом каждому сервису нужно оставить возможность задать собственные значения.
В разборе EnvironmentPostProcessor показано, как добавить источник свойств до создания контекста приложения. Размещение через addLast() даёт ему низкий приоритет: настройки сервиса, переменные окружения и аргументы запуска смогут перекрыть значения по умолчанию.
Подход пригодится команде с десятками сервисов и общим стартером. Выберите несколько повторяющихся параметров, перенесите их в один источник и добавьте тест, который проверит переопределение на уровне приложения.
Полезные ресурсы по Java 👩💻| Наш канал в MAX 🟪
Капсульная коллекция в Т-Шопе
Повод порадовать себя и разнообразить гардероб. Смотри, какие вещи созданы для плавного перехода из будней в выходные.
Посмотреть каталог
#реклама
tbank-online.com
О рекламодателе
Java: помогите IDE заметить возможный `NullPointerException` до запуска программы.
Аннотации `@NonNull` и `@Nullable` описывают контракт: где null недопустим, а где его нужно обработать.
String displayName(@NonNull User user) {
@Nullable String name = user.getName();
if (name == null) {
return "unknown";
}
return name.toUpperCase();
}
`user` не должен быть `null`, а имя может отсутствовать – поэтому перед toUpperCase() стоит проверка.
При поддержке выбранных аннотаций IDE или статический анализатор предупредит о нарушении контракта прямо во время написания кода.
Сами аннотации не гарантируют проверку во время выполнения. Их поведение зависит от библиотеки и инструментов. Чтобы контракт работал между методами, помечайте и параметры, и возвращаемые значения – например, getName().
Полезные ресурсы по Java 👩💻| Наш канал в MAX 🟪
Вы можете использовать @JsonCreator, чтобы обеспечить предсказуемое преобразование JSON в Java-объекты.
Указывает точный конструктор, который должен вызвать Jackson.
@JsonProperty явно связывает каждое поле JSON с соответствующим свойством объекта.
Отлично подходит для неизменяемых (immutable) типов — сеттеры не требуются.
Полезные ресурсы по Java 👩💻| Наш канал в MAX 🟪
Знаете, почему после записи ByteBuffer данные сразу не читаются?
У буфера есть position и limit. После put позиция указывает на место следующей записи, поэтому сначала переключаем его из режима записи в режим чтения:
buffer.put(payload);
buffer.flip();
flip переносит текущую position в limit и возвращает position в начало. Теперь чтение ограничено только записанными байтами, а не всей ёмкостью буфера.
Читаем данные, пока между position и limit остаются байты:
while (buffer.hasRemaining()) {
process(buffer.get());
}
После чтения clear подготавливает буфер к новой записи. Он сбрасывает position и limit, но не стирает старые байты, поэтому счётчики состояния нельзя путать с очисткой памяти.
Если часть данных ещё не обработана, compact сохраняет остаток в начале и оставляет место для новых байтов:
buffer.compact();
buffer.put(nextChunk);
Такой цикл удобен при чтении неполных сетевых сообщений. Остаток переносится вперёд, а новые данные дописываются после него.
Полезные ресурсы по Java 👩💻| Наш канал в MAX 🟪
@ConditionalOnClass: конфигурация включается, если нужный класс есть в classpath
Используется в автоконфигурациях Spring Boot, например для Kafka и Redis.
Если класса нет, условная конфигурация пропускается.
В паре с @ConditionalOnMissingBean позволяет предоставить бин по умолчанию, который приложение может заменить собственным.
Полезные ресурсы по Java 👩💻| Наш канал в MAX 🟪
Метод equals() используется для сравнения двух объектов на равенство. Он определен в классе Object и, по умолчанию, выполняет сравнение ссылок на объекты (то есть проверяет, являются ли объекты одним и тем же объектом в памяти). Многие классы переопределяют этот метод, чтобы сравнивать содержимое объектов, а не только ссылки.
Контракт equals
При переопределении метода equals разработчик должен придерживаться основных правил, определенных в спецификации языка Java.
Рефлексивность
для любого заданного значения x, выражение x.equals(x) должно возвращать true.
Заданного — такого, что x != null
Симметричность
для любых заданных значений x и y, x.equals(y) должно возвращать true только в том случае, когда y.equals(x) возвращает true.
Транзитивность
для любых заданных значений x, y и z, если x.equals(y) возвращает true и y.equals(z) возвращает true, x.equals(z) должно вернуть значение true.
Согласованность
для любых заданных значений x и y повторный вызов x.equals(y) будет возвращать значение предыдущего вызова этого метода при условии, что поля, используемые для сравнения этих двух объектов, не изменялись между вызовами.
Сравнение null
для любого заданного значения x вызов x.equals(null) должен возвращать false.
Полезные ресурсы по Java 👩💻| Наш канал в MAX 🟪
Назови основные свойства транзакции
В базах данных и многопоточных системах транзакция — это атомарная последовательность операций, которая должна выполняться корректно и полностью.
Атомарность (Atomicity) — "всё или ничего"
Транзакция выполняется полностью или не выполняется вовсе.
Перевод 1000 рублей с одного счёта на другой:
- Списать 1000 рублей с А
- Зачислить 1000 рублей на B
Если вторая операция не удалась, первая должна быть отменена.
try {
connection.setAutoCommit(false); // Отключаем автокоммит
withdraw(accountA, 1000);
deposit(accountB, 1000);
connection.commit(); // Подтверждаем транзакцию
} catch (Exception e) {
connection.rollback(); // Откат в случае ошибки
}
Согласованность (Consistency) — "данные остаются корректными"
После транзакции данные должны оставаться в логически правильном состоянии.
Изолированность (Isolation) — "отдельно от других транзакций"
Одна транзакция не должна мешать выполнению другой.
Два клиента одновременно бронируют одно и то же место в самолёте.
Система должна обработать их по очереди, а не одновременно.
В Java изолированность регулируется уровнями транзакций (TRANSACTION_READ_COMMITTED, TRANSACTION_REPEATABLE_READ и т. д.), чтобы избежать проблем, таких как "грязное чтение" или "фантомные записи".
connection.setTransactionIsolation(Connection.TRANSACTION_REPEATABLE_READ);
Долговечность (Durability) — "данные не теряются"
После успешного завершения транзакции данные не должны теряться даже при сбоях (например, отключении электричества).
Полезные ресурсы по Java 👩💻| Наш канал в MAX 🟪