Ну всё, хватит отдыхать 😁
Обсудим интересные фичи 21 java.
Переход на версию LTS — не просто "модно", а реальная возможность повысить продуктивность проекта. Вот на что стоит обратить внимание:
При миллионе одинаковых тестовых задач время получается следующее :
— FixedThreadPool : 33 мин.
— CachedThreadPool : 1:26 мин.
— VirtualThreadPerTask : всего 14 секунд
Производительность и масштабируемость на новом уровне.
Record-паттерны позволяют одновременно проверять тип и извлекать поля, свитчи стали мощнее — меньше кода, больше читаемости.
Минимальные задержки (sub-миллисекунды) и оптимальное управление памятью, что идеально для latency-чувствительных приложений.
Новый синтаксис для динамических строк (например, JSON-создание) создает меньше ошибок и улучшает читаемость.
Последовательные операции легко доступны: getFirst(), getLast(), reversed() — удобно и логично.
#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥12👍7❤3😁1
Чёткая схема API помогает наладить диалог между провайдером и клиентом, а единый формат ошибок — избавить потребителей от хаоса в коде и лишних поводов для «боли».
🔹 В Spring Boot по умолчанию структура ошибок выглядит так:
{
"timestamp": "2021-15-08T14:32:17.947+0000",
"status": 500,
"error": "Internal Server Error",
"path": "/test"
}
Такая форма ответа не всегда содержит тип ошибки для обработки на клиенте, а также предоставляет мало контекста для формирования пользовательских сообщений.
🔹 Решение: разработать унифицированную структуру, например:
{
"error": {
"type": "USER_NOT_FOUND",
"message": "User with ID 12345 not found.",
"status": 500,
"path": "/integration/apps",
"timestamp": "2021-15-08T14:32:17.947+0000",
"data": {
"userId": "12345"
}
}
}
🔹 Как внедрить:
▪️ Создаём единое исключение AppException:
public final class AppException extends RuntimeException {
private final ErrorType type;
private Map<String, Object> data;
// конструктор и геттеры...
}
public enum ErrorType {
USER_NOT_FOUND(404), AUTHENTICATION_FAILED(401), …;
private final int status;
// геттеры...
}
▪️ Глобальный обработчик:
Используем @ControllerAdvice с @ExceptionHandler(AppException.class) для перехвата ошибок и возвращения QErrorResponse, содержащего нужную структуру
▪️ Обработка всех остальных ошибок:
Создаём свой ErrorController, заменяющий BasicErrorController, и возвращаем данные в таком же формате QErrorResponse:
@RestController
@RequestMapping("${server.error.path:${error.path:/error}}")
public class RestErrorController extends AbstractErrorController {
// логика формирования QErrorResponse…
}
Это гарантирует, что любые ошибки возвращаются в одинаковом формате .
🔹 Почему это важно:
— Унификация ответа облегчает обработку ошибок на клиенте.
— Контекст в data позволяет выдавать более понятные сообщения пользователю.
— Расширяемость дает возможность добавлять новые типы ошибок при сохранении консистентности.
#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
❤8👍4🔥3🥱1
Please open Telegram to view this post
VIEW IN TELEGRAM
😁27👍1🔥1🌚1
Forwarded from Библиотека задач по Java | тесты, код, задания
Какие принципы нарушены в коде?
Anonymous Quiz
9%
DRY и S из SOLID
51%
D и S из SOLID
12%
O и I из SOLID
4%
KISS и DRY
24%
Посмотреть ответ
❤3👍2🔥1