Отложенная инициализация
Отложенная инициализация — это паттерн проектирования, который позволяет отложить создание объекта до момента его реального использования. Он полезен, когда создание объекта требует значительных ресурсов или происходит в условиях, когда объект может не понадобиться.
В Java есть несколько способов реализации отложенной инициализации. Два наиболее распространенных подхода — это использование двойной проверки и использование внутреннего класса. На картинке мы рассмотрели использование двойной проверки (Double-Checked Locking).
✅ Java библиотека #java
Отложенная инициализация — это паттерн проектирования, который позволяет отложить создание объекта до момента его реального использования. Он полезен, когда создание объекта требует значительных ресурсов или происходит в условиях, когда объект может не понадобиться.
В Java есть несколько способов реализации отложенной инициализации. Два наиболее распространенных подхода — это использование двойной проверки и использование внутреннего класса. На картинке мы рассмотрели использование двойной проверки (Double-Checked Locking).
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14❤6🔥4
Forwarded from Java Guru 🤓
Что будет с бином, если активный профиль не задан?
Anonymous Quiz
27%
Бин будет зарегистрирован в контексте
14%
Произойдет ошибка загрузки контекста из-за отсутствия активного профиля
46%
Бин не будет зарегистрирован в контексте
10%
Все бины с аннотацией @Profile будут зарегистрированы
4%
Ошибка компиляции
👍4🔥4❤3
Паттерн Цепочка обязанностей (Chain of Responsibility)
Chain of Responsibility — это поведенческий паттерн, который позволяет передавать запросы по цепочке обработчиков, пока один из них не обработает запрос. Каждый обработчик в цепочке решает, может ли он обработать запрос или передать его следующему по цепочке.
Использование:
🔹 Когда нужно избежать жесткой привязки отправителя запроса к получателю.
🔹 Когда запрос должен быть обработан несколькими объектами, но заранее неизвестно, кто именно обработает запрос.
🔹 Когда необходимо гибко настраивать систему, добавляя или убирая обработчиков.
Преимущества:
1️⃣ Ослабляет связанность между объектами, отправляющими запросы, и объектами, обрабатывающими их.
2️⃣ Позволяет динамически добавлять новые обработчики в цепочку.
3️⃣ Способствует соблюдению принципа единственной ответственности, позволяя каждому обработчику заниматься своей задачей.
Недостатки:
1️⃣ Может быть сложнее отслеживать, кто в конечном итоге обработал запрос, особенно при длинных цепочках.
2️⃣ Не гарантирует, что запрос будет обработан, если ни один из обработчиков не способен это сделать.
3️⃣ Может усложнить структуру программы при использовании большого числа обработчиков.
📌 Паттерн полезен, когда необходимо разделить ответственность за обработку запросов между несколькими объектами, не создавая прямых зависимостей между ними.
✅ Java библиотека #java
Chain of Responsibility — это поведенческий паттерн, который позволяет передавать запросы по цепочке обработчиков, пока один из них не обработает запрос. Каждый обработчик в цепочке решает, может ли он обработать запрос или передать его следующему по цепочке.
Использование:
🔹 Когда нужно избежать жесткой привязки отправителя запроса к получателю.
🔹 Когда запрос должен быть обработан несколькими объектами, но заранее неизвестно, кто именно обработает запрос.
🔹 Когда необходимо гибко настраивать систему, добавляя или убирая обработчиков.
Преимущества:
Недостатки:
📌 Паттерн полезен, когда необходимо разделить ответственность за обработку запросов между несколькими объектами, не создавая прямых зависимостей между ними.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7❤5🔥5😁2
Инкапсуляция
Инкапсуляция — это принцип ООП, который заключается в сокрытии внутреннего представления класса от внешнего мира. Для этого используются модификаторы доступа: private, protected, public.
Обычно поля класса делаются private или protected, а методы — public. Это позволяет скрыть реализацию класса и предоставить к ней контролируемый доступ через public методы.
При запуске этой программы на выходе мы получим:
John 0
✅ Java библиотека #java
Инкапсуляция — это принцип ООП, который заключается в сокрытии внутреннего представления класса от внешнего мира. Для этого используются модификаторы доступа: private, protected, public.
Обычно поля класса делаются private или protected, а методы — public. Это позволяет скрыть реализацию класса и предоставить к ней контролируемый доступ через public методы.
При запуске этой программы на выходе мы получим:
John 0
Please open Telegram to view this post
VIEW IN TELEGRAM
❤11👍4🔥3😁2🎄1
Конструктор по умолчанию
Конструктор по умолчанию предоставляется компилятором Java, если в классе не определен ни один другой конструктор. Конструктор по умолчанию инициализирует все поля класса значениями по умолчанию (например, 0 для числовых типов, false для типа boolean, null для ссылочных типов).
Если же в классе определен хотя бы один конструктор (с параметрами или без), компилятор не будет предоставлять конструктор по умолчанию, и его необходимо определить явно, если он нужен.
В этом примере мы определяем класс MyClass с двумя полями: x и y, а также определяем конструктор по умолчанию, который выводит сообщение при вызове. В методе main создаем экземпляр класса MyClass, используя конструктор по умолчанию, и выводим значения полей x и y, которые инициализированы значениями по умолчанию.
✅ Java библиотека #java
Конструктор по умолчанию предоставляется компилятором Java, если в классе не определен ни один другой конструктор. Конструктор по умолчанию инициализирует все поля класса значениями по умолчанию (например, 0 для числовых типов, false для типа boolean, null для ссылочных типов).
Если же в классе определен хотя бы один конструктор (с параметрами или без), компилятор не будет предоставлять конструктор по умолчанию, и его необходимо определить явно, если он нужен.
В этом примере мы определяем класс MyClass с двумя полями: x и y, а также определяем конструктор по умолчанию, который выводит сообщение при вызове. В методе main создаем экземпляр класса MyClass, используя конструктор по умолчанию, и выводим значения полей x и y, которые инициализированы значениями по умолчанию.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11❤4🔥2
Выше приведён список контролируемых исключений (Checked Exceptions) в Java, определенных в java.lang.
✅ Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13❤6🔥2
Forwarded from Java Guru 🤓
Какие варианты создания потоков являются верными?
Anonymous Quiz
40%
1, 2, 3
13%
1, 2, 3, 5
4%
1, 4
11%
Только 2
31%
Все верные
🔥10👍4❤2
Можно ли считать Final переменную константой?
Поскольку у нас не получится присвоить новое значение для final переменной, кажется, что это переменные константы. Но это только на первый взгляд. Если тип данных, на который ссылается переменная — immutable, то да, это константа.
А если тип данных mutable, то есть изменяемый, при помощи методов и переменных можно будет изменить значение объекта, на который ссылается final переменная, и в таком случае назвать ее константой нельзя. Так вот, на примере видно, что часть финальных переменных действительно константы, а часть — нет, и их можно изменить.
✅ Java библиотека #java
Поскольку у нас не получится присвоить новое значение для final переменной, кажется, что это переменные константы. Но это только на первый взгляд. Если тип данных, на который ссылается переменная — immutable, то да, это константа.
А если тип данных mutable, то есть изменяемый, при помощи методов и переменных можно будет изменить значение объекта, на который ссылается final переменная, и в таком случае назвать ее константой нельзя. Так вот, на примере видно, что часть финальных переменных действительно константы, а часть — нет, и их можно изменить.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍22❤6🔥4
Как определить, содержит ли массив определенное значение в Java с помощью потоков?
Чтобы проверить, содержит ли массив значений int, double или long значение, используйте IntStream, DoubleStream или LongStream соответственно.
✅ Java библиотека #java
Чтобы проверить, содержит ли массив значений int, double или long значение, используйте IntStream, DoubleStream или LongStream соответственно.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13🔥6❤2⚡1
Когда фронт и бэк живут на разных доменах — CORS становится головной болью. Но Spring Boot даёт достаточно способов это настроить — от простых аннотаций до централизованной фильтрации.
Если нужно открыть доступ только к одному контроллеру или методу:
@CrossOrigin(origins = "https://example.com")
@RestController
public class ApiController {
@GetMapping("/data")
public String getData() {
return "OK";
}
}
Удобно для быстрого прототипа, но неудобно для масштабируемого решения.
Если CORS нужен везде, лучше использовать конфигурационный класс:
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("https://example.com")
.allowedMethods("GET", "POST", "PUT", "DELETE")
.allowedHeaders("*")
.allowCredentials(true);
}
}
Даёт полный контроль. Можно задать разные правила для разных путей.
Если вы используете Gateway, настройка может быть ещё проще:
spring:
cloud:
gateway:
globalcors:
corsConfigurations:
'[/**]':
allowedOrigins: "https://example.com"
allowedMethods:
- GET
- POST
allowedHeaders: "*"
Подходит, если CORS должен работать до попадания запроса в конкретный микросервис.
Если CORS работает «через раз», возможно, его блокирует Spring Security. Добавьте .cors() в конфигурацию:
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.cors() // 👈 Без этого CORS не заработает
.and()
.authorizeHttpRequests(auth -> auth.anyRequest().permitAll());
return http.build();
}
}
✅ Проверьте через curl:
curl -H "Origin: https://example.com" \
-H "Access-Control-Request-Method: GET" \
-X OPTIONS http://localhost:8080/data -v
Ответ должен содержать заголовки:
Access-Control-Allow-Origin: https://example.com
Access-Control-Allow-Methods: GET
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13🔥8❤7🎄1
Forwarded from Java Guru 🤓
Что будет в результате вызова метода?
Anonymous Quiz
13%
Исключение при сохранении, но данные первой записи останутся
3%
Исключение при сохранении, но данные второй записи останутся
4%
Исключение при сохранении, но данные обеих записей останутся
5%
Spring игнорирует исключение, данные обеих записей останутся
76%
Откат транзакции, ничего не сохранено
🔥8❤4👍3
Работаете в большом проекте и устали искать, где находится метод или переменная? IntelliJ IDEA умеет молниеносно прыгать к исходному коду — всё, что нужно, это Ctrl + B (или Cmd + B на macOS).
— Вместо ручного поиска по файлам вы сразу попадаете в нужное место в коде.
— Работает с методами, классами, интерфейсами, переменными, импортами и даже с SQL-мэппингами в JPA.
— Наведите курсор на интересующий метод, переменную или класс.
— Нажмите Ctrl + B (или Cmd + B на macOS).
— IDEA мгновенно откроет определение — будь то в вашем коде, в сторонней библиотеке или в decompiled-классе.
Очень удобно, когда нужно быстро понять, что именно делает вызываемый метод, особенно если работаете с чужим кодом.
Please open Telegram to view this post
VIEW IN TELEGRAM
2👍28❤7🔥4🤩1
Forwarded from Java Guru 🤓
Что будет результатом этого кода?
Anonymous Quiz
2%
Программа выведет значения в одном потоке. Только Thread-1 выполнит задачу
9%
Программа выведет значения по очереди. Сначала выполнится Thread-1, затем Thread-2
75%
Результат будет перемешан. Оба потока работают параллельно, порядок вывода строк не гарантируется
3%
Программа выбросит исключение. Использование Runnable без синхронизации вызовет ошибку
11%
Программа не выведет ничего. Потоки завершатся до выполнения задач.
👍8🔥4
Нужно быстро набросать сервис для бизнес-функции? AI поможет сэкономить часы на шаблонах, валидации и boilerplate.
📝 Промпт:
Generate a Spring Boot REST endpoint that handles [описание бизнес-логики]. Include request/response DTOs, validation, exception handling, and service-layer interaction. Use best practices and explain design decisions.
— Добавьте
Use Java 17+ features if possible, чтобы сразу писать современно— Добавьте
Add unit tests for controller and service, чтобы не откладывать на потом— Добавьте
Make it modular for future feature extension, если планируется масштабированиеPlease open Telegram to view this post
VIEW IN TELEGRAM
2👍7🔥4❤1
Forwarded from Java Guru 🤓
Почему возможна ошибка во время выполнения кода?
Anonymous Quiz
10%
Метод equals вызывается от null
5%
Поле id не инициализировано
52%
Нет проверки, является ли obj экземпляром BadEquals
4%
Метод equals HE synchronized
29%
Проблема с доступом к полю id
❤5👍4🔥3
В проде важно не просто «чтобы работало», а знать, как работает. Spring Boot Actuator позволяет получать системную информацию, но по-настоящему полезным он становится с кастомными метриками.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
</dependency>
Также добавьте экспорт метрик в application.yml:
management:
endpoints:
web:
exposure:
include: health, info, metrics, prometheus
metrics:
export:
prometheus:
enabled: true
Например, метрика количества обращений к сервису:
@Component
public class CustomMetrics {
private final Counter requestCounter;
public CustomMetrics(MeterRegistry registry) {
this.requestCounter = Counter.builder("custom_requests_total")
.denoscription("Total custom requests")
.register(registry);
}
public void countRequest() {
requestCounter.increment();
}
}
Теперь можно вызывать countRequest() в любом месте.
@RestController
@RequiredArgsConstructor
public class MetricsTestController {
private final CustomMetrics customMetrics;
@GetMapping("/hello")
public String hello() {
customMetrics.countRequest();
return "Hello!";
}
}
Каждый вызов /hello увеличивает счётчик.
Откройте в браузере или через curl:
http://localhost:8080/actuator/prometheus
Найдите строку:
custom_requests_total{...} 42.0Please open Telegram to view this post
VIEW IN TELEGRAM
👍15❤2🔥2❤🔥1