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

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

Сотрудничество @offercraft_support
Download Telegram
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥5😁3👍2👏1
Тестирование с помощью JUnit 5

JUnit 5 — это популярный фреймворк для тестирования Java-приложений. Он предоставляет мощные инструменты для написания и выполнения тестов, а также поддерживает различные возможности, такие как аннотации, расширения и параметры тестирования. Вот основные моменты тестирования Java-кода с помощью JUnit 5, включая примеры.

*️⃣Основные аннотации JUnit 5

1️⃣@Test: аннотация, указывающая, что метод является тестовым.

2️⃣ @BeforeEach: метод, помеченный этой аннотацией, будет выполняться перед каждым тестом.

3️⃣ @AfterEach: метод, помеченный этой аннотацией, будет выполняться после каждого теста.

4️⃣ @BeforeAll: метод, помеченный этой аннотацией, будет выполняться один раз перед всеми тестами (должен быть статическим).

5️⃣@AfterAll: метод, помеченный этой аннотацией, будет выполняться один раз после всех тестов (должен быть статическим).

6️⃣@DisplayName: позволяет задать более читаемое имя для теста.

Рассмотрим пример простого класса Calculator и его тестирования с помощью JUnit 5.

public class Calculator {
public int add(int a, int b) {
return a + b;
}

public int subtract(int a, int b) {
return a - b;
}

public int multiply(int a, int b) {
return a * b;
}

public double divide(int a, int b) {
if (b == 0) {
throw new IllegalArgumentException("Division by zero");
}
return (double) a / b;
}
}


Тестовый класс TestCalculator
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.*;

class CalculatorTest {

private Calculator calculator;

@BeforeEach
void setUp() {
calculator = new Calculator();
}

@AfterEach
void tearDown() {
// Здесь можно освободить ресурсы, если это необходимо
}

@Test
@DisplayName("Тестирование сложения")
void testAdd() {
assertEquals(5, calculator.add(2, 3), "2 + 3 должно быть равно 5");
assertEquals(-1, calculator.add(-2, 1), "-2 + 1 должно быть равно -1");
}

@Test
@DisplayName("Тестирование вычитания")
void testSubtract() {
assertEquals(1, calculator.subtract(3, 2), "3 - 2 должно быть равно 1");
assertEquals(-3, calculator.subtract(-2, 1), "-2 - 1 должно быть равно -3");
}

@Test
@DisplayName("Тестирование умножения")
void testMultiply() {
assertEquals(6, calculator.multiply(2, 3), "2 * 3 должно быть равно 6");
assertEquals(-2, calculator.multiply(-1, 2), "-1 * 2 должно быть равно -2");
}

@Test
@DisplayName("Тестирование деления")
void testDivide() {
assertEquals(2.0, calculator.divide(4, 2), "4 / 2 должно быть равно 2.0");
assertThrows(IllegalArgumentException.class, () -> calculator.divide(1, 0), "Деление на ноль должно выбрасывать IllegalArgumentException");
}
}


Тесты можно запускать из IDE (например, IntelliJ IDEA или Eclipse) или с помощью командной строки с использованием Maven или Gradle.

Если вы используете Maven, убедитесь, что у вас в pom.xml добавлена зависимость JUnit 5:

<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>5.9.0</version>
<scope>test</scope>
</dependency>


*️⃣Заключение

JUnit 5 — это мощный инструмент для тестирования Java-приложений. Он предоставляет множество возможностей для организации и выполнения тестов. Использование аннотаций @BeforeEach, @AfterEach, @Test и других позволяет создавать чистые и понятные тестовые классы. Тестирование кода помогает обеспечить его корректность и надежность при изменениях и добавлении новых функций.

🖥Java Developer | Backend |#⃣ #обучение #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4🔥3👏2
Созвон с начальством

🖥 Java Developer | Backend | #⃣#мемы #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3🔥2😁2
🔤 Транзакции в Spring: сила управления данными

Сегодня разберемся с транзакциями в Spring так, чтобы всё стало ясно и понятно: зачем они нужны, как работают и как их настроить так, чтобы данные были под контролем.

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

🖥Java Developer | Backend |#⃣ #статья #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Что такое ThreadPool (Часть 1)

ThreadPool (пул потоков) в Java — это механизм, который позволяет управлять группой потоков для выполнения задач. Вместо создания нового потока для каждой задачи, что может быть неэффективно и затратно по ресурсам, пул потоков переиспользует уже существующие потоки для выполнения новых задач. Это позволяет значительно улучшить производительность приложения, особенно в сценариях с большим количеством задач.

*️⃣Основные компоненты ThreadPool:

1️⃣ Executor: интерфейс, который определяет метод execute(), используемый для выполнения задач.

2️⃣ ExecutorService: подинтерфейс Executor, который добавляет методы для управления жизненным циклом пула.

3️⃣ ThreadPoolExecutor: конкретная реализация ExecutorService, которая предоставляет расширенные возможности настройки пула потоков.

*️⃣Пример использования ThreadPool с помощью Executors:

Java предоставляет класс Executors, который позволяет легко создать пул потоков. Например, можно создать фиксированный пул потоков с заданным количеством потоков.

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ThreadPoolExample {
public static void main(String[] args) {
// Создание пула из 5 потоков
ExecutorService executorService = Executors.newFixedThreadPool(5);

// Добавление задач в пул
for (int i = 0; i < 10; i++) {
final int taskId = i;
executorService.submit(() -> {
System.out.println("Задача " + taskId + " выполняется в потоке " + Thread.currentThread().getName());
try {
Thread.sleep(2000); // Имитация долгой задачи
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
System.out.println("Задача " + taskId + " завершена");
});
}

// Завершение работы пула
executorService.shutdown();
}
}


🖥Java Developer | Backend |#⃣ #обучение #java
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥3👍2👏2
Вопрос: Для чего используется Connection pool?
Ответ -
Взаимодействие с базой данных может быть затратным, в отношении открытия и закрытия подключений к базе данных. Особенно, когда число клиентов базы данных увеличивается, эти затраты очень высоки, и потребляется большое количество ресурсов. Пул подключений к базе данных получается при запуске сервером приложений и поддерживается в пуле. Запрос на подключение обслуживается подключением, находящимся в пуле. В конце подключения запрос возвращается в пул и может использоваться для удовлетворения будущих запросов.

🖥 Java Developer | Backend | #⃣#вопрос #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3🔥2
Please open Telegram to view this post
VIEW IN TELEGRAM
6
Вопрос: Что такое RMI? (Remote Method Invocation)
Ответ -
Java Remote Method Invocation (Java RMI) — это API Java, который выполняет объектно-ориентированный эквивалент удаленных вызовов процедур (RPC) с поддержкой прямой передачи сериализованных классов Java и распределенной сборки мусора. Удаленный вызов методов (RMI) также можно рассматривать как процесс активации метода на удаленно запущенном объекте. RMI обеспечивает прозрачность местоположения, поскольку пользователь чувствует, что метод выполняется на локально запущенном объекте.

🖥 Java Developer | Backend | #⃣#вопрос #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Что такое ThreadPool (Часть 2)

Если вам нужно вернуть результат выполнения задачи, вы можете использовать интерфейсы Callable и Future:

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

public class ThreadPoolWithCallable {
public static void main(String[] args) {
ExecutorService executorService = Executors.newFixedThreadPool(3);

// Создание задачи
Callable<Integer> task = () -> {
Thread.sleep(1000);
return 42; // Возвращаемое значение
};

// Выполнение задачи
Future<Integer> future = executorService.submit(task);

try {
// Получение результата
Integer result = future.get();
System.out.println("Результат задачи: " + result);
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
} finally {
executorService.shutdown();
}
}
}

😎Преимущества использования ThreadPool:

1️⃣Улучшение производительности: Переиспользование потоков снижает накладные расходы на создание и уничтожение потоков.

2️⃣ Управление ресурсами: Позволяет ограничить количество одновременно работающих потоков, что помогает избежать перегрузки системы.

3️⃣Упрощение кода: Упрощает управление многопоточностью, так как разработчику не нужно заботиться о создании и управлении потоками вручную.

*️⃣Заключение

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

🖥Java Developer | Backend |#⃣ #обучение #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍31
🔤 Один день из жизни JVM-инженера

Почему JVM-инженеры всё так медленно делают? На каком языке стоит писать рантайм, а на каком компилятор? Как «папка бога» в Windows привела к неожиданным последствиям? Может ли «обычный джавист» стать JVM-инженером?

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

🖥Java Developer | Backend |#⃣ #статья #java
Please open Telegram to view this post
VIEW IN TELEGRAM
9👍1
Please open Telegram to view this post
VIEW IN TELEGRAM
😁4
Leetcode. Задача 318. Maximum Product of Word Lengths. (medium)

Дан массив строк words, верните максимальное значение произведения длины word[i] на длину word[j], где два слова не имеют общих букв. Если таких двух слов не существует, верните 0.

Пример:
Input: words = ["abcw","baz","foo","bar","xtfn","abcdef"]
Output: 16
Explanation: The two words can be "abcw", "xtfn".


👨‍💻 Алгоритм:

1️⃣Предварительная обработка масок и длин
Вычислите битовые маски для всех слов и сохраните их в массиве masks. Сохраните длины всех слов в массиве lens.

2️⃣Сравнение слов и проверка общих букв
Сравните каждое слово с каждым последующим словом. Если два слова не имеют общих букв (проверка с использованием масок: (masks[i] & masks[j]) == 0), обновите максимальное произведение maxProd.

3️⃣Возврат результата
Верните максимальное значение произведения maxProd.

😎 Решение:
class Solution {
public int maxProduct(String[] words) {
int n = words.length;
int[] masks = new int[n];

for (int i=0; i<n; i++)
for (char c: words[i].toCharArray())
masks[i] |= (1 << (c - 'a'));

int largest = 0;
for (int i=0; i<n-1; i++)
for (int j=i+1; j<n; j++)
if ((masks[i] & masks[j]) == 0)
largest = Math.max(largest, words[i].length() * words[j].length());

return largest;
}
}


🖥 Java Developer | Backend | #⃣#задача #java
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥3
Вопрос: Что такое URL-кодирование и URL-декодирование?
Ответ -
Процедура URL-кодирования отвечает за замену всех пробелов и всех других дополнительных специальных символов URL-адреса на их соответствующее шестнадцатеричное представление. Соответственно, URL-декодирование — это прямо противоположная процедура.

🖥 Java Developer | Backend | #⃣#вопрос #java
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥21
🔤 Знакомство с АОП

В современном мире IT-разработки существует довольно большое множество различных подходов к написанию программ. Так, например, кому-то нравиться представлять программу в виде последовательности действий, а кто-то считает, что программа должна представлять собой множество объектов, общающихся друг с другом. Совокупности этих идей и понятий образуют своего рода стиль написания программы, который принято назвать – парадигма программирования.

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

🖥Java Developer | Backend |#⃣ #статья #java
Please open Telegram to view this post
VIEW IN TELEGRAM
5
Please open Telegram to view this post
VIEW IN TELEGRAM
4😁4👍1
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
🔤 «Почему Kotlin хуже, чем Java?»

В данной статье рассказывается о сравнении java и kotlin, а так же почему стоит использовать java вместо kotlin

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

🖥Java Developer | Backend |#⃣ #статья #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9
Please open Telegram to view this post
VIEW IN TELEGRAM
😁3
Дорогие подписчики! ☃️
Поздравляю вас с новым годом! 🍭 Желаю вам новых профессиональных побед, интересных событий, финансового благополучия и крепкого здоровья в новом году! 🧦🔴🎁🔥
Please open Telegram to view this post
VIEW IN TELEGRAM
7🔥3👍2
Использование 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
👍3🔥2👏1
🔤 Люди не понимают ООП

Похоже, многим не нравится объектно-ориентированное программирование. Первое, что приходит в голову, когда слышишь эту трёхбуквенную аббревиатуру — это пример с автомобилем, наследование, геттеры, сеттеры и ObjectFactoryFactorySingleton.

Мне это всегда казалось довольно странным. Мне не только нравится ООП, я ещё и считаю, что часто это лучший/наиболее очевидный способ моделирования задачи. И ниже я расскажу, почему.


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

🖥Java Developer | Backend |#⃣ #статья #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2