Telegram Web Link
Повысьте эффективность MongoDB, используя составной индекс Spring Data по принципу ESR

Позволяет настроить оптимальную индексацию для ускорения поиска данных и повышения производительности приложения. 🔥

https://mongodb.com/docs/manual/tutorial/equality-sort-range-rule/

@javatg
💻 Библиотека Scout — быстрый и безопасный DI на Kotlin

Scout — это библиотека, появившаяся как результат большого количества проб и ошибок. Пет-проекты с кастомными DI-контейнерами. Изучение каждого нового DI-фреймворка, который появлялся в комьюнити.
Держите полезную статью о том, как Scout создавалась и какие проблемы может решать.

Вот ещё некоторые факты из статьи:
*️⃣Библиотека Scout использует рефлексию для доступа к содержимому графа и предоставляет защищенные методы для обращения к нему.

*️⃣Валидация графа становится сложной из-за отказа от аннотаций, но может быть проверена в unit-тестах.

*️⃣Библиотека предлагает удобный и настраиваемый валидатор графа зависимостей.

📎 Читать подробнее

@android_its
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Разница между Errors и Exceptions в Java

Если сразу к сути, то ошибки (Errors) в Java представляют собой критические ситуации, часто вызванные проблемами на уровне системы или аппаратного обеспечения, например, OutOfMemoryError. Такие ошибки, как правило, являются фатальными. Обычно программист не способен контролировать их, и не рекомендуется пытаться их перехватывать.

А вот исключения (Exceptions) можно обработать в программе: исключения могут указывать, например, на ошибки пользовательского ввода или проблемы сетевого подключения. Исключения подразделяются на проверяемые, обработка которых их обязательна, как IOException, и непроверяемые, подразумевающие ошибки во время выполнения программы, например, NullPointerException. Обрабатывать рекомендуется как раз исключения, а не ошибки.
// Пример защитного программирования
try {
// Участок кода, где могут произойти ошибки ввода/вывода
} catch (IOException ex) {
// Обрабатываем исключение и продолжаем выполнение
}



Чуть более детально

Проверяемые исключения в Java – это исключения, для которых обязательно использование обработки, необходимо применять конструкции try-catch или ключевое слово throws. Этот тип исключений помогает программисту планировать выход из непредвиденных ситуаций, повышая устойчивость кода.

Непроверяемые исключения и ошибки могут появиться при выполнении программы и не требуют явной обработки. Они часто свидетельствуют о непроработанной логике или некорректно заданных данных. Они не прерывают выполнение программы, но могут указывать на необходимость внесения изменений в код.

📎 Читать подробнее

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
💻 Создание анонимного экземпляра интерфейса в Kotlin

Если сразу к сути, то для создания экземпляра анонимного интерфейса в Kotlin применяется объектное выражение. Определите интерфейс непосредственно при инициализации переменной следующим образом:

val myInterfaceInstance = object : MyInterface {
override fun myFunction() {
// Ваш код здесь
}
}

myInterfaceInstance.myFunction()

В данном примере переменной myInterfaceInstance мы присваиваем объект, используя ключевое слово object :
Далее указываем название интерфейса, а затем в фигурных скобках представляем реализацию необходимых функций с помощью переопределения.


Создание экземпляра SAM-интерфейса, используя лямбду

Интерфейс с одним абстрактным методом (SAM) в Kotlin может быть представлен лямбдой. Котлин предлагает более лаконичную запись для интерфейсов с единственным методом:

fun interface MySAMInterface {
fun myAction()
}

val myInterfaceInstance = MySAMInterface {
println("Смотрите, мама, я пишу код без использования рук!")
}

myInterfaceInstance.myAction()


Здесь для сокращения записи при создании анонимного экземпляра используется лямбда-выражение. Не забывайте, что SAM-преобразования доступны лишь для интерфейсов, имеющих только один абстрактный метод.

📎 Читать подробнее

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
#JUnit 5.11 наконец-то будет поддерживать стандартную семантику Java при определении того, является ли поле или метод видимым/переопределенным!

Это будет серьезное изменение, но, надеюсь, оно будет одобрено сообществом. 🤞🏼

https://github.com/junit-team/junit5/commit/3e5a5df057093f0edf832bff3cec8d4e0a9af3da

https://junit.org/junit5/docs/snapshot/release-notes/index.html#release-notes-5.11.0-M1-junit-jupiter-bug-fixes

@javatg
🖥Паттерны в программировании на Java (ну и не только)

Очень часто на собеседованиях разработчики сталкиваются с вопросом про паттерны.
В связи с этим не помешает их повторить, держите полезную статью.
Это обсуждение паттернов проектирования в Java Core. Примеры паттернов иллюстрируются на примере интерфейсов и классов Java Core.

Те самые 5 паттернов
— Стратегия
— Декоратор
— Фасад
— Итератор
— Шаблонный метод

📎 Статья

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Что означает "@Override" перед объявлением метода?

▶️Что означает @Override перед объявлением метода?

▶️На самом деле аннотация @Override указывает, что далее мы собираемся переопределять метод базового класса.
При этом, если в базовом классе не окажется метода с аналогичной сигнатурой, то мы получим предупреждение компилятора о том, что хотя мы и собирались что-то переопределить, по факту этого не произошло.
На этом действие аннотации заканчивается.

🔘Таким образом, аннотация никак не влияет на сам факт переопределения метода - при совпадении сигнатур с методом базового класса он и так будет переопределен, независимо от наличия, либо отсутствия этой аннотации. Аннотация служит лишь для контроля успешности действия при сборке проекта.

🔘В случае отсутствия данной аннотации и не совпадении сигнатур (в результате ошибки) с методом, который мы собирались переопределять - случится страшное - очень трудноуловимая ошибка, когда вы думаете, что должно бы переопределяться, а по факту имеете отдельный независимый метод, который скорее всего вообще не выполняется. При этом компилятор считает, что с его точки зрения все в порядке - хотите собственный метод в классе-наследнике - нет проблем. И молчит.

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
💻 Создаем первое приложение с Jetpack Compose на Kotlin

Держите годное видео о том, как с помощью фреймворка Jetpack Compose создать проект в Android Studio.

📎 Кликабельный план ролика
📎 Само видео

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Создание Javadoc на уровне пакета: package-info.java или package.html

Для документирования пакетов в Java предпочтительнее использовать package-info.java, а не package.html. Это обусловлено поддержкой аннотаций в package-info.java, что дает большие возможности по интеграции с фреймворками и обеспечивает типобезопасность. Более того, создатели инструментов среды разработки чаще выбирают package-info.java из-за его консистентности и возможности включения тегов версий, таких как @since.

А вот пример использования package-info.java:
/**
* Пакет, содержащий инструменты для апплетов и связующие интерфейсы.
* @since 1.2
*/
@FrameworkAnnotation
package com.example.applet;

import com.example.framework.FrameworkAnnotation;


📎 Подробнее

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Для чего нужен модификатор transient?

▶️Каково назначение модификатора transient в Java?

▶️Чтобы ответить на этот вопрос, сперва вспомним ещё один термин.
Сериализация — это преобразование экземпляра класса в форму, пригодную для его сохранения (например в файл, в БД или для передачи по сети). Сериализованные объекты можно затем восстановить (десериализовать).

Свойства класса, помеченные модификатором transient, не сериализуются.

Обычно в таких полях хранится промежуточное состояние объекта, которое, к примеру, проще вычислить, чем сериализовать, а затем десериализовать. Другой пример такого поля — ссылка на экземпляр объекта, который не требует сериализации или не может быть сериализован.

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Микросервисы — собеседование по Java. Разбор вопросов и ответов

🔥 Держите отличную подборку вопросов и ответов на позицию Java-разработчика. Большой акцент делается работе с микросервисами.
Всего здесь 114 вопросов, они есть простые/сложные, теоретические/практические, уверен найдёте здесь много полезного для себя

Вот, кстати, некоторые вопросы:
• Что такое сплоченность микросервисов?
• В чем разница между макетом и заглушкой?
• Что вы знаете о тестовой пирамиде Майка Кона?
• Какова цель Docker?
• Можем ли мы использовать микросервисы для создания конечных автоматов?
• Что такое Spring Cloud?
• Как решать сквозные проблемы, такие как безопасность, в архитектуре микросервисов?
• Что такое Netflix Feign? В чем его преимущества?
• Почему отладка так сложна в микросервисной архитектуре?

Пользуйтесь)
📎 Ссылка

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Гексагональная архитектура и микросервисы на Java

Держите наиполезнейший ролик, где автор делится своим пониманием этой архитектуры, которую кто-то знает как "Порты и адаптеры".
В процессе создаётся проект с использованием гексагональной архитектуры, демонстрируется создание модуля "Каталог" и его взаимодействие с внешним миром.
Создаются интерфейсы для входящих и исходящих портов, а также классы для реализации логики приложения.

План
• 00:01:34 Гексагональная архитектура
• 00:08:32 Применение гексагональной архитектуры
• 00:30:01 Разделение модуля на библиотеки
• 00:41:25 Разработка модульного монолита
• 01:08:57 Разработка микросервисов

🖥 Репозиторий GitHub
📎 YouTube

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥Подборка лучших обучающих каналов для программистов.

➡️ Делитесь с коллегами и сохраняйте себе, чтобы не потерять

Машинное обучение

Machine Learning - запускаем лучшие ИИ модели, пишем код, погружаемся в нейросети
Ml Собеседование - подготовка к собесу по мл, алгоритмам, коду
Ml ru - актуальные статьи, новости, код и обучающие материалы
Ml Jobs - вакансии ML
ML Книги - актуальные бесплатные книги МО
ML чат

🏆 Golang
Golang - изучи один из самых перспективных языков на ит-рынке
Golang собеседование - разбор задач и вопросов с собесов
Golang вакансии -работа для Go разработчика
Golang книги библиотека книг
Golang задачи и тесты
Golang чат
Golang news - новости из мира go
Golang дайджест

💥 Linux /Этичный хакинг
Linux Academy - гайды, секреты и лучшие материалы по Linux
Kali linux - погрузись в мир этичного хакинга и кибербезопасности
linux_kal - kali чат
Информационная безопасность

🚀 Data Science

Анализ данных - полезные фишки, код, гайды и советы, маст-хэв датасаентиста
Data Jobs - ds вакансии
Аналитик данных
Data Science книги - актуальные бесплатные книги
Big data

🛢Базы данных
Sql базы данных - научим работе с базами данных профессионально
Библиотека баз данных
SQL чат
Вакансии Sql аналитик данных

#️⃣C#

С# академия - лучший канал по c#
С# заметки — код, лучшие практики, заметки программиста c#
С# задачи и тесты
С# библиотека - актуальные бесплатные книги
C# вакансии - работа

🐍 Python

Python/django - самый крупный обучающий канал по Python
Python Собеседование - подготовка к собеседовению python и разбор алгоритмов
Pro python - статьи, новости, код и обучающие материалы
Python Jobs - вакансии Python
Python чат
Python книги

Java

Java академия - java от Senior разработчика
Java вакансии
Java чат
Java вопросы с собеседований
Java книги

💻 C++

C++ академия
С++ книги
C++ задачи - подготовка к собеседовению мл, алгоритмам
C++ вакансии

⚡️ Frontend
Javascript академия - крупнейший js канал
React - лучшие гайды и советы по работе с react
Frontend - тутрориалы, уроки, гайды, код
PHP
Книги frontend
Задачи frontend

🦀 Rust
Rust программирование
Rust чат
Rust книги для программистов

📲 Мобильная разработка
Android разработка
Мобильный разработчик гайды и уроки

🇬🇧 Английский для программистов

🧠 Искусственный интеллект
ИИ и технологии
Neural - нейросети для работы и жизни
Книги ИИ
Artificial Intelligence

🔥 DevOPs
Devops для программистов
Книги Devops

🌟 Docker/Kubernets
Docker
Kubernets

📓 Книги
Библиотеки Книг для программситов

💼 Папка с вакансиями:
Папка Go разработчика:
Папка Python разработчика:
Папка Data Science
Папка Java разработчика
Папка C#
Папка Frontend
🖥 Какие отличия между @NotEmpty, @NotBlank и @NotNull?

▶️В разных примерах Entity класса, по-разному валидируют поля:
@NotNull
@Size(min=3)
@Column(name = "login")
private String login;

@Email
@Size(min=6, max=80)
@NotBlank(message="{register.email.invalid}")
@Column(name = "email", unique=true)
private String email;

@Column(name = "first_name")
@NotEmpty(message = "Please provide your first name")
private String firstName;

@Column(name = "last_name")
@NotEmpty(message = "Please provide your last name")
private String lastName;

@Transient
private String password;

Но какие между ними различия и что следует использовать и в каких случаях?

А также если указана аннотация @Size(min=6, max=80) нужно ли дополнительно проверять с помощью @NotBlank или других аннотаций?


▶️Итак, ответ:

@NotBlank применяется только к строкам и проверяет, что строка не пуста.

@NotNull применяется к CharSequence, Collection, Map или Array и проверяет, что объект не равен null. Но при этом он может быть пуст.

@NotEmpty применяется к CharSequence, Collection, Map или Array и проверяет, что он не null имеет размер больше 0.

Аннотация @Size(min=6) пропустит строку состоящую из 6 пробелов и/или символов переноса строки, а @NotBlank не пропустит.

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
Новосибирск, 25 апреля приглашаем на митап IT Talk by Sber для Java- и DevOps-разработчиков! 🤩

Мы собрали экспертов из разных команд и городов, чтобы рассказать о технологиях и инструментах, которые увеличивают эффективность работы разработчика и всей команды.

На митапе обсудим интересные темы:

👉 Советы для оптимизации сборки Java-проектов, практики CI и автоматизации сборки приложений.

👉 Что такое код с точки зрения законодательства, кому он принадлежит и какие есть права у автора кода?

👉 Инциденты в проме: что делать и не делать, чтобы устранить инцидент, и что на самом деле происходит, когда вы видите «Сервис недоступен, повторите операцию через 5 минут или позже»?

Встречаемся 25 апреля с 17:30 до 22:00 в лофте FoodFactory: Новосибирск, ул. Коммунистическая, 14.

Регистрируйтесь по ссылке!
🖥 Настройка активного профиля и конфига в Spring Boot

Итак, для быстрой установки указывайте профиль и путь к файлам конфигурации Spring Boot, используя следующие параметры:
Профили: --spring.profiles.active=имя_профиля
Путь к конфигурации: --spring.config.location=путь_к_конфигурации

Пример команды:
java -jar app.jar --spring.profiles.active=dev --spring.config.location=file:/config/

С помощью этой команды будет активирован профиль dev, а конфигурация загружена из указанного каталога.

Однако, командная строка Spring Boot предоставляет намного больше возможностей. Давайте рассмотрим это детальнее.


Понимание типов свойств и комбинирование профилей

Важно отделять системные свойства Java от свойств Spring по префиксам -D и -- соответственно. Параметры командной строки позволяют настраивать приложение Spring Boot при его запуске.
# Почему бы не воспользоваться преимуществами двух подходов?
java -Dspring.profiles.active=dev,qa -jar ваше_приложение.jar

Эта команда активирует одновременно профили dev и qa, что дает возможность объединить настройки из нескольких профилей, при условии что они разработаны для совместного использования.

📎 Читать подробнее

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Хороший стиль обработки ошибок

Правильная и хорошая обработка ошибок — довольно важная часть в разработке. Но как это делать правильно?

Когда делать RuntimeException, а когда просто Exception

Единственен ли способ генерации ошибки оператором throw?

В каких лучше случаях создать, допустим, MyException extends Exception, а затем MyOtherException extends MyException? Иными словами, как увидеть необходимость в иерархии ошибок?

Когда делать примерно так:
public void f() throws MyException {
//некоторый код ...
if (....){
throw MyException(...);
}
}


Какие еще есть способы генерации ошибок?

Когда правильнее переносить ошибку на уровень функции (... f() throws ...)?


▶️Что ж, попробуем на это ответить.
Во-первых, используйте исключения. Создайте свою иерархию исключений и продумайте, какие из них сделать *runtime*, а какие нет. Никогда не используйте конструкции типа new Exception(...) или new RuntimeException. Вместо этого старайтесь создавать и кидать только адекватные ситуации исключения. Создание экземпляра Exception или RuntimeException — халтура и отписка вместо обработки ошибок.

Не забывайте проверять все параметры в конструкторах и, по возможности, в методах и своевременно кидать IllegalArgumentException. Пользуйтесь стандартными исключениями в соответствующих случаях. Используйте их по назначению и никогда не кидайте что попало.

Пользуйтесь try/catch/finally. Не забывайте уничтожать ресурсы.

Пользуйтесь логгерами, а не делайте e.printStackTrace. Никогда не делайте catch пустым, если только вы не уверены, что должны именно проигнорировать исключение.

При логгировании пользуйтесь по возможности полный метод log с уровнем логгирования, сообщением и исключением. Старайтесь в сообщении к логу описать, что именно упало и добавить какие-то сведения об условиях в блоке try. Это поможет выявить проблемы в боевых условиях. Старайтесь назначать адекватные уровни логгирования.

📎 Подробнее про обработку ошибок тут

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
2024/11/20 08:51:35
Back to Top
HTML Embed Code: