Java Developer | Backend
1.71K subscribers
136 photos
1 video
231 links
Авторский канал действующего java разработчика

Платформа: https://offercraft.ru

Сотрудничество @offercraft_support
Download Telegram
Вопрос: Что такое Java Remote Method Invocation (RMI)?
Ответ -
RMI - это API Java, который выполняет объектно-ориентированный эквивалент удаленных вызовов процедур (RPC) с поддержкой прямой передачи сериализованных классов Java и распределенной сборки мусора. Удаленный вызов метода (RMI) также можно рассматривать как процесс активации метода на удаленно запущенном объекте. RMI обеспечивает прозрачность местоположения, поскольку для пользователя это выглядит так, что метод выполняется на локально запущенном объекте.

🖥 Java Developer | Backend | #⃣#вопрос #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍31
Паттерны проектирования. Структурные паттерны. Bridge (Мост).

Паттерн проектирования "Мост" (Bridge) используется для разделения абстракции и реализации, что позволяет изменять их независимо друг от друга. Этот паттерн особенно полезен, когда у вас есть множество возможных реализаций и абстракций, которые могут изменяться независимо, что делает систему более гибкой и расширяемой.
interface Engine {
void setEngine();
}
abstract class Car {
protected Engine engine;
public Car(Engine engine){
this.engine = engine;
}
abstract public void setEngine();
}
class SportCar extends Car {
public SportCar(Engine engine) {
super(engine);
}
public void setEngine() {
System.out.print("SportCar engine: ");
engine.setEngine();
}
}
class UnknownCar extends Car {
public UnknownCar(Engine engine) {
super(engine);
}
public void setEngine() {
System.out.print("UnknownCar engine: ");
engine.setEngine();
}
}
class SportEngine implements Engine {
public void setEngine(){
System.out.println("sport");
}
}
class UnknownEngine implements Engine {
public void setEngine(){
System.out.println("unknown");
}
}
public class BridgeTest {
public static void main(String[] args) {
Car sportCar = new SportCar(new SportEngine());
sportCar.setEngine();
System.out.println();
Car unknownCar = new UnknownCar(new UnknownEngine());
unknownCar.setEngine();
}
}

😎 Преимущества паттерна Bridge

1⃣ Гибкость: Позволяет изменять реализацию и абстракцию независимо друг от друга.

2⃣Упрощение кода: Избегает создания множества подклассов для каждой комбинации абстракции и реализации.

3⃣ Легкость в расширении: Новые реализации и абстракции могут быть добавлены без изменения существующего кода.

😌 Недостатки паттерна Bridge

1⃣Сложность: Увеличивает количество классов в системе.

2⃣Потенциальная путаница: Понимание структуры может быть сложнее из-за разделения на абстракцию и реализацию.

Таким образом, паттерн "Мост" является мощным инструментом для создания гибких и расширяемых систем с четким разделением ответственности между абстракцией и реализацией.

🖥Java Developer | Backend |#⃣ #обучение #java
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥4
🔤 Test-Driven Development: как полюбить модульное тестирование

Мы разберём страхи, останавливающие разработчика перед тем, чтобы начать, наконец, писать тесты. Выявим очевидные преимущества. Рассмотрим основные правила разработки через тестирование. И подкрепим всё это реальными примерами.

🔗 Ссылка на статью

🖥Java Developer | Backend |#⃣ #статья #java
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥21
Использование PreparedStatement для предотвращения SQL-инъекций

При работе с базами данных в Java, использование PreparedStatement является предпочтительным методом по сравнению с обычным Statement. Это связано с тем, что PreparedStatement помогает предотвратить SQL-инъекции и улучшает производительность за счет предварительной компиляции SQL-запросов.

Пример использования PreparedStatement

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class JdbcPreparedStatementExample {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3000/mydatabase";
String user = "username";
String password = "password";

String sql = "INSERT INTO users (username, password) VALUES (?, ?)";

try (Connection conn = DriverManager.getConnection(url, user, password);
PreparedStatement pstmt = conn.prepareStatement(sql)) {

pstmt.setString(1, "newuser");
pstmt.setString(2, "securepassword");
pstmt.executeUpdate();

System.out.println("User added successfully!");

} catch (SQLException e) {
e.printStackTrace();
}
}
}


Использование PreparedStatement не только защищает ваше приложение от SQL-инъекций, но и улучшает читаемость кода. Это особенно важно при работе с пользовательскими данными.

🖥Java Developer | Backend |#⃣ #обучение #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2🔥2
Please open Telegram to view this post
VIEW IN TELEGRAM
😁3
Please open Telegram to view this post
VIEW IN TELEGRAM
😁3
Please open Telegram to view this post
VIEW IN TELEGRAM
😁2
❗️Разница между JDBC и JPA подходами

Разберём принципиальные различия между низкоуровневым JDBC и ORM-подходом JPA.

1️⃣ JDBC (Java Database Connectivity)
Connection conn = DriverManager.getConnection(url, user, pass);
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM users");

while (rs.next()) {
String name = rs.getString("name");
// ручное преобразование
}

Характеристики:
- Низкоуровневый API для SQL-запросов
- Требует ручного управления соединениями
- Необходимо вручную преобразовывать ResultSet в объекты

2️⃣JPA (Java Persistence API)
@Entity
public class User {
@Id
private Long id;
private String name;
// геттеры/сеттеры
}

// Использование:
User user = entityManager.find(User.class, 1L);

*️⃣Особенности:
- Высокоуровневая абстракция (ORM)
- Работа с объектами вместо SQL
- Автоматическое управление сессиями
- Кеширование, ленивая загрузка

*️⃣Ключевые различия:

▫️ Уровень абстракции
JDBC: SQL-ориентированный
JPA: Объектно-ориентированный

▫️ Преобразование данных
JDBC: Ручное
JPA: Автоматическое

▫️ Производительность
JDBC: Выше
JPA: Может быть ниже из-за накладных расходов

▫️ Код
JDBC: Больше boilerplate
JPA: Лаконичнее

▫️ Портативность
JDBC: Зависит от SQL диалекта
JPA: Независимость от БД

Резюмируем:
- JDBC даёт полный контроль, но требует больше кода
- JPA повышает продуктивность, скрывая сложности
- Для сложных запросов иногда комбинируют оба подхода
- Выбор зависит от проекта: JPA для бизнес-приложений, JDBC для высоконагруженных систем

Совет: Современные проекты часто используют Spring Data JPA, который ещё больше упрощает работу с JPA.

🖥Java Developer | Backend |#⃣ #обучение #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2🔥2
Please open Telegram to view this post
VIEW IN TELEGRAM
😁4
Вопрос: Что такое Java Memory Model и как он влияет на многопоточность?
Ответ -
Java Memory Model (JMM) определяет, как потоки взаимодействуют друг с другом через общую память. Он гарантирует видимость изменений, сделанных одним потоком, для других потоков. JMM вводит понятия "синхронизация", "медленная и быстрая память" и "порядок выполнения", что помогает избежать проблем, таких как гонки данных. Для обеспечения корректного взаимодействия потоков используются ключевые слова volatile, synchronized и блоки Lock.

🖥 Java Developer | Backend | #⃣#вопрос #java
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥3👍2
Гениально же 😁

🖥 Java Developer | Backend | #⃣#мемы #java
Please open Telegram to view this post
VIEW IN TELEGRAM
😁3
🔤 Java Logging: история кошмара

Тернист и извилист путь Java-платформы к правильному способу записи строчек в лог-файлы. История logging в Java довольно познавательна в плане изучения особенностей Open Source, в том числе его взаимодействия с корпорациями и единичными программистами.

🔗 Ссылка на статью

🖥Java Developer | Backend |#⃣ #статья #java
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2
Какова цель метода Class.forName?
Ответ -
Этот метод используется для загрузки драйвера, который установит соединение с базой данных.

🖥 Java Developer | Backend | #⃣#вопрос #java
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥3
🔤 Простые сценарии использования Sonarqube

На сегодняшний день sonarqube - один из самый известный способ автоматического анализа кода и его ревью. В данной статье показан процесс настройки sonarqube для вашего проекта.

🔗 Ссылка на статью

👩‍💻 Java Developer | Backend |#⃣ #статья #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Please open Telegram to view this post
VIEW IN TELEGRAM
😁3
Roadmap "Как стать java разработчиком".
Карта показывает необходимые навыки для изучения

🔗 Ссылка

👩‍💻 Java Developer | Backend |#⃣ #обучение #java
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥21
Please open Telegram to view this post
VIEW IN TELEGRAM
😁4
MapStruct: Ультимативный маппинг в Java

Если вы все еще вручную копируете данные из Entity в DTO через сеттеры, пора переходить на MapStruct. Это кодогенератор, который работает на этапе компиляции. В отличие от аналогов на Reflection (типа ModelMapper), он создает чистый и быстрый Java-код, который легко дебажить.

Почему это стандарт индустрии?
*️⃣Производительность: Скорость прямого вызова методов.
*️⃣Безопасность: Ошибка в имени поля обнаружится при сборке, а не в рантайме.
*️⃣Гибкость: Поддержка вложенных объектов и кастомных конвертеров.

Пример реализации:
@Mapper(componentModel = "spring")
public interface UserMapper {
@Mapping(source = "email", target = "login")
@Mapping(target = "fullName", expression = "java(u.getFirstName() + ' ' + u.getLastName())")
UserDto toDto(User u);
}


MapStruct делает ваш код чище, а разработку — приятнее.

👩‍💻Java Developer | Backend |#⃣ #обучение #java
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥21
❗️SQL Academy: Где реально набить руку на запросах

Нашел крутой тренажер для тех, кто хочет подтянуть SQL без скучной теории. Главный плюс — вы решаете задачи в браузере на живых базах данных.

Почему стоит глянуть:

*️⃣Sandbox-режим: Пишешь код и сразу видишь результат.
*️⃣Уровни: От простых SELECT до жестких джойнов.
*️⃣Собесы: Задачи максимально приближены к реальным вопросам из интервью

🔗 Ссылка

👩‍💻Java Developer | Backend |#⃣ #полезныересурсы #java
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥21
Эволюция Java-разработки с SonarQube

SonarQube — стандарт индустрии для контроля качества Java-кода. Инструмент автоматизирует поиск багов, уязвимостей и «запахов кода», бесшовно интегрируясь в CI/CD через Maven или Gradle. Это позволяет поддерживать архитектурную целостность и системно минимизировать техдолг. Применение SonarQube гарантирует, что в релизную ветку попадает только код, прошедший строгую проверку на надежность и производительность.

*️⃣Контроль через Quality Gates (QG)
Quality Gates — это автоматизированный «чек-лист», определяющий готовность кода к деплою. Если проект не соответствует заданным порогам, статус проверки меняется на Failed, и сборка блокируется.

ℹ️Вот основные метрики, которые чаще всего настраивают в QG:
*️⃣New Code Coverage: Процент покрытия юнит-тестами новых изменений. Обычно устанавливается порог >80%, чтобы предотвратить попадание непроверенной логики в мастер-ветку.
*️⃣Maintainability Rating: Оценка поддерживаемости. Если расчетное время на исправление «запахов кода» (code smells) превышает лимит, рейтинг падает ниже A, и QG не проходится.
*️⃣Security Rating: Критерий, блокирующий поставку при наличии хотя бы одной открытой уязвимости (Vulnerability) или критической точки риска (Security Hotspot).
*️⃣Duplicated Lines: Контроль за дублированием кода. Обычно считается недопустимым наличие более 3-5% дубликатов на весь объем новых строк.

Использование Quality Gates исключает субъективность при приемке кода и позволяет команде сфокусироваться на создании фич, не отвлекаясь на базовый аудит безопасности.

👩‍💻Java Developer | Backend |#⃣ #обучение #java
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2
Software Composition Analysis (SCA): Безопасность внешних компонентов

В современной Java-разработке до 90% итогового кода приложения составляют сторонние библиотеки. SCA (Software Composition Analysis) — это методология автоматизированного аудита этих зависимостей. В отличие от классического статического анализа (SAST), который проверяет ваш авторский код, SCA фокусируется на рисках, приходящих извне вместе с Open Source компонентами.

#️⃣ Практические примеры работы SCA

Инструменты SCA анализируют манифесты сборки (например, pom.xml или build.gradle) и выявляют две основные группы проблем:

1️⃣ Идентификация известных уязвимостей (CVE)
Если в проекте используется библиотека с публично известной дырой в безопасности, SCA заблокирует сборку.

Пример в Maven:
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.14.1</version>
</dependency>


*️⃣ Действие системы: Инструмент укажет на конкретную запись в базе данных уязвимостей (например, CVE-2021-44228) и выдаст рекомендацию по обновлению до безопасной версии 2.17.1.

2️⃣ Лицензионный комплаенс
SCA проверяет, не нарушают ли лицензии библиотек юридическую политику компании.

*️⃣ Пример: Использование библиотеки с лицензией GPL в коммерческом закрытом продукте.
*️⃣Действие системы: Система предупредит, что данная лицензия является «вирусной» и требует открытия исходного кода всего вашего приложения, что часто недопустимо для проприетарного ПО.

#️⃣ Ключевые функции
*️⃣ Детекция транзитивных зависимостей: Проверка не только тех библиотек, что вы прописали явно, но и тех, что они «тянут» за собой по цепочке.
*️⃣ Формирование SBOM: Создание «паспорта» приложения (Software Bill of Materials) — полного реестра всех используемых компонентов.

#️⃣Вывод

Внедрение SCA в CI/CD пайплайн Java-проекта — это не просто дополнительный этап проверки, а критическое требование безопасности. Это позволяет разработчикам использовать всю мощь Open Source, сохраняя контроль над защищенностью и юридической чистотой продукта. В современных реалиях SCA является обязательным дополнением к анализу кода, формируя комплексный подход к качеству ПО.

👩‍💻Java Developer | Backend |#⃣ #обучение #java
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2