Вопросы с собеседования 👩💻
Что такое StringPool в Java?
Что такое StringPool в Java?
Anonymous Quiz
10%
Это пул для хранения всех объектов в Java.
80%
Это пул для хранения строковых литералов.
5%
Это пул для хранения примитивных типов.
5%
Это пул для хранения потоков.
Please open Telegram to view this post
VIEW IN TELEGRAM
Лучшие практики, советы и нюансы тестирования в Spring
Тестирование — это важная часть разработки приложений на Spring, которая помогает обеспечить стабильность и корректность работы кода. В этом посте мы рассмотрим лучшие практики, советы и нюансы, которые помогут вам писать качественные тесты.
1. Изолируйте тесты
Каждый тест должен быть независимым и не зависеть от состояния, созданного другими тестами. Это позволяет избежать ложных срабатываний и упрощает отладку.
Используйте `@Transactional`:
Аннотация @Transactional автоматически откатывает изменения в базе данных после завершения теста.
Очищайте базу данных:
Если вы не используете @Transactional, очищайте базу данных перед каждым тестом с помощью @Sql или вручную.
Используйте правильные типы тестов
Unit-тесты:
Тестируйте отдельные компоненты (например, сервисы или репозитории) в изоляции. Используйте моки для зависимостей.
Интеграционные тесты:
Тестируйте взаимодействие нескольких компонентов (например, сервисов и репозиториев) вместе. Используйте @SpringBootTest.
Используйте Testcontainers для интеграционных тестов
Testcontainers позволяет запускать реальные базы данных (например, PostgreSQL) в Docker-контейнерах. Это делает тесты более приближенными к production-среде.
- Пример:
#Java #Training #Spring #Testing #Mockito
Тестирование — это важная часть разработки приложений на Spring, которая помогает обеспечить стабильность и корректность работы кода. В этом посте мы рассмотрим лучшие практики, советы и нюансы, которые помогут вам писать качественные тесты.
1. Изолируйте тесты
Каждый тест должен быть независимым и не зависеть от состояния, созданного другими тестами. Это позволяет избежать ложных срабатываний и упрощает отладку.
Используйте `@Transactional`:
Аннотация @Transactional автоматически откатывает изменения в базе данных после завершения теста.
@Test
@Transactional
void testSaveUser() {
User user = new User("John Doe");
userRepository.save(user);
assertThat(userRepository.findAll()).hasSize(1);
}
Очищайте базу данных:
Если вы не используете @Transactional, очищайте базу данных перед каждым тестом с помощью @Sql или вручную.
@Test
@Sql("/scripts/cleanup.sql")
void testUserCreation() {
// Тестовый код
}
Используйте правильные типы тестов
Unit-тесты:
Тестируйте отдельные компоненты (например, сервисы или репозитории) в изоляции. Используйте моки для зависимостей.
@ExtendWith(MockitoExtension.class)
public class UserServiceTest {
@Mock
private UserRepository userRepository;
@InjectMocks
private UserService userService;
@Test
void testFindUserById() {
when(userRepository.findById(1L)).thenReturn(Optional.of(new User("John Doe")));
User user = userService.findUserById(1L);
assertThat(user.getName()).isEqualTo("John Doe");
}
}
Интеграционные тесты:
Тестируйте взаимодействие нескольких компонентов (например, сервисов и репозиториев) вместе. Используйте @SpringBootTest.
@SpringBootTest
public class UserServiceIntegrationTest {
@Autowired
private UserService userService;
@Test
void testCreateUser() {
User user = userService.createUser("Jane Doe");
assertThat(user).isNotNull();
}
}
Используйте Testcontainers для интеграционных тестов
Testcontainers позволяет запускать реальные базы данных (например, PostgreSQL) в Docker-контейнерах. Это делает тесты более приближенными к production-среде.
- Пример:
@Testcontainers
@SpringBootTest
public class UserRepositoryTest {
@Container
static PostgreSQLContainer<?> postgres = new PostgreSQLContainer<>("postgres:13");
@DynamicPropertySource
static void registerPgProperties(DynamicPropertyRegistry registry) {
registry.add("spring.datasource.url", postgres::getJdbcUrl);
registry.add("spring.datasource.username", postgres::getUsername);
registry.add("spring.datasource.password", postgres::getPassword);
}
@Test
void testSaveUser() {
User user = new User("John Doe");
userRepository.save(user);
assertThat(userRepository.findAll()).hasSize(1);
}
}
#Java #Training #Spring #Testing #Mockito
Тестируйте edge-кейсы
Убедитесь, что ваши тесты покрывают не только "счастливый путь", но и граничные случаи:
- Ошибки валидации.
- Отсутствие данных в базе.
- Нарушение уникальности.
- Исключения в транзакциях.
- Пример:
Используйте моки для сложных зависимостей
Моки позволяют изолировать тестируемый компонент от внешних зависимостей, таких как базы данных, внешние API или другие сервисы.
- Пример с Mockito:
Тестируйте асинхронный код
Для тестирования асинхронных методов используйте CompletableFuture и CountDownLatch.
- Пример:
Тестируйте события
Spring предоставляет механизм событий через ApplicationEventPublisher. Убедитесь, что события публикуются и обрабатываются корректно.
- Пример:
Оптимизируйте производительность тестов
Минимизируйте контекст Spring:
Используйте @DataJpaTest, @WebMvcTest и другие специализированные аннотации вместо @SpringBootTest, если это возможно.
Кэшируйте контекст Spring:
Если тесты используют один и тот же контекст, Spring может кэшировать его для ускорения выполнения.
Документируйте тесты
Используйте понятные имена тестов:
Имена тестов должны отражать их цель (например, testCreateUser_withNullName_throwsException).
Добавляйте комментарии:
Если тест сложный, добавьте пояснения, чтобы облегчить понимание.
Автоматизируйте тестирование
Интегрируйте тесты в CI/CD:
Убедитесь, что тесты запускаются автоматически при каждом коммите.
Используйте инструменты для анализа покрытия:
Например, JaCoCo для измерения покрытия кода тестами.
#Java #Training #Spring #Testing #Mockito
Убедитесь, что ваши тесты покрывают не только "счастливый путь", но и граничные случаи:
- Ошибки валидации.
- Отсутствие данных в базе.
- Нарушение уникальности.
- Исключения в транзакциях.
- Пример:
@Test
void testUserNotFound() {
assertThatThrownBy(() -> userService.findUserById(999L))
.isInstanceOf(UserNotFoundException.class);
}
Используйте моки для сложных зависимостей
Моки позволяют изолировать тестируемый компонент от внешних зависимостей, таких как базы данных, внешние API или другие сервисы.
- Пример с Mockito:
@Test
void testSendEmail() {
EmailService emailService = mock(EmailService.class);
UserService userService = new UserService(emailService);
userService.notifyUser("user@example.com");
verify(emailService).sendEmail("user@example.com");
}
Тестируйте асинхронный код
Для тестирования асинхронных методов используйте CompletableFuture и CountDownLatch.
- Пример:
@Test
void testAsyncMethod() throws Exception {
CountDownLatch latch = new CountDownLatch(1);
CompletableFuture<String> future = asyncService.asyncMethod();
future.whenComplete((result, ex) -> {
assertThat(result).isEqualTo("Done");
latch.countDown();
});
latch.await(2, TimeUnit.SECONDS);
assertThat(future.isDone()).isTrue();
}
Тестируйте события
Spring предоставляет механизм событий через ApplicationEventPublisher. Убедитесь, что события публикуются и обрабатываются корректно.
- Пример:
@Test
void testEventPublication() {
eventService.publishEvent("Test Message");
assertThat(events.stream(CustomEvent.class))
.hasSize(1)
.first()
.satisfies(event -> assertThat(event.getMessage()).isEqualTo("Test Message"));
}
Оптимизируйте производительность тестов
Минимизируйте контекст Spring:
Используйте @DataJpaTest, @WebMvcTest и другие специализированные аннотации вместо @SpringBootTest, если это возможно.
Кэшируйте контекст Spring:
Если тесты используют один и тот же контекст, Spring может кэшировать его для ускорения выполнения.
Документируйте тесты
Используйте понятные имена тестов:
Имена тестов должны отражать их цель (например, testCreateUser_withNullName_throwsException).
Добавляйте комментарии:
Если тест сложный, добавьте пояснения, чтобы облегчить понимание.
Автоматизируйте тестирование
Интегрируйте тесты в CI/CD:
Убедитесь, что тесты запускаются автоматически при каждом коммите.
Используйте инструменты для анализа покрытия:
Например, JaCoCo для измерения покрытия кода тестами.
#Java #Training #Spring #Testing #Mockito
Введение в Lombok и базовые аннотации
Всем привет!
Сегодня мы начинаем серию постов, посвященных библиотеке Lombok. Если вы устали писать boilerplate-код (геттеры, сеттеры, toString, equals и т.д.), то Lombok — это то, что вам нужно! Давайте разберемся, что это за библиотека и как она может упростить вашу жизнь.
Что такое Lombok и зачем он нужен?
Lombok — это библиотека для Java, которая помогает сократить объем шаблонного кода. Она автоматически генерирует методы, такие как геттеры, сеттеры, toString(), equals(), hashCode() и другие, во время компиляции. Это делает код более чистым и удобным для чтения.
Пример без Lombok:
Пример с Lombok:
Установка Lombok в проект
Maven (проверяйте версии в библиотеке Maven):
Добавьте зависимость в pom.xml:
Gradle:
Добавьте зависимость в build.gradle:
Аннотация @Getter и @Setter
Эти аннотации автоматически генерируют геттеры и сеттеры для всех полей класса.
Пример:
Как это работает:
Lombok генерирует методы getName(), setName(), getAge(), setAge() во время компиляции. Эти методы добавляются в байт-код, но не отображаются в исходном коде.
Нюансы:
Можно применять аннотации к отдельным полям, если не нужно генерировать методы для всех полей.
Уровень доступа методов можно изменить с помощью параметра AccessLevel:
Аннотация @ToString
Эта аннотация автоматически генерирует метод toString(), который возвращает строковое представление объекта.
Пример:
Как это работает:
Lombok генерирует метод toString(), который выглядит примерно так:
Нюансы:
Можно исключить поля из toString() с помощью параметра exclude:
Можно включить только определенные поля с помощью параметра of:
#Java #Training #Spring #Lombok #Getter #Setter #ToString
Всем привет!
Сегодня мы начинаем серию постов, посвященных библиотеке Lombok. Если вы устали писать boilerplate-код (геттеры, сеттеры, toString, equals и т.д.), то Lombok — это то, что вам нужно! Давайте разберемся, что это за библиотека и как она может упростить вашу жизнь.
Что такое Lombok и зачем он нужен?
Lombok — это библиотека для Java, которая помогает сократить объем шаблонного кода. Она автоматически генерирует методы, такие как геттеры, сеттеры, toString(), equals(), hashCode() и другие, во время компиляции. Это делает код более чистым и удобным для чтения.
Пример без Lombok:
public class User {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
Пример с Lombok:
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
@Getter
@Setter
@ToString
public class User {
private String name;
private int age;
}
Lombok убирает необходимость писать шаблонный код, что особенно полезно в больших проектах.
Установка Lombok в проект
Maven (проверяйте версии в библиотеке Maven):
Добавьте зависимость в pom.xml:
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.36</version>
<scope>provided</scope>
</dependency>
Gradle:
Добавьте зависимость в build.gradle:
dependencies {
compileOnly 'org.projectlombok:lombok:1.18.36'
annotationProcessor 'org.projectlombok:lombok:1.18.36'
}
Аннотация @Getter и @Setter
Эти аннотации автоматически генерируют геттеры и сеттеры для всех полей класса.
Пример:
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class User {
private String name;
private int age;
}
Как это работает:
Lombok генерирует методы getName(), setName(), getAge(), setAge() во время компиляции. Эти методы добавляются в байт-код, но не отображаются в исходном коде.
Нюансы:
Можно применять аннотации к отдельным полям, если не нужно генерировать методы для всех полей.
Уровень доступа методов можно изменить с помощью параметра AccessLevel:
@Getter(AccessLevel.PROTECTED)
private String name;
Аннотация @ToString
Эта аннотация автоматически генерирует метод toString(), который возвращает строковое представление объекта.
Пример:
import lombok.ToString;
@ToString
public class User {
private String name;
private int age;
}
Как это работает:
Lombok генерирует метод toString(), который выглядит примерно так:
@Override
public String toString() {
return "User(name=" + this.name + ", age=" + this.age + ")";
}
Нюансы:
Можно исключить поля из toString() с помощью параметра exclude:
@ToString(exclude = "age")
public class User {
private String name;
private int age;
}
Можно включить только определенные поля с помощью параметра of:
@ToString(of = "name")
public class User {
private String name;
private int age;
}
#Java #Training #Spring #Lombok #Getter #Setter #ToString
Что выведет код?
#Tasks
public class Task1001245_1 {
public static void main(String[] args) {
String s1 = "hello";
String s2 = new String("hello");
String s3 = "hello";
String s4 = s2.intern();
System.out.println((s1 == s2) + " " + (s1 == s3) + " " + (s1 == s4));
}
}
#Tasks
Варианты ответа:
Anonymous Quiz
26%
true true true
13%
false false true
0%
true false false
61%
false true true
Вопросы с собеседования 👩💻
Что такое static в Java?
Что такое static в Java?
Anonymous Quiz
5%
Ключевое слово для создания объектов.
2%
Ключевое слово для создания потоков.
90%
Ключевое слово для обозначения переменных и методов, принадлежащих классу, а не объекту.
2%
Ключевое слово для создания анонимных классов.
Please open Telegram to view this post
VIEW IN TELEGRAM
Lombok, базовые аннотации
Аннотация @EqualsAndHashCode
Эта аннотация автоматически генерирует методы equals() и hashCode(), которые используются для сравнения объектов.
Пример:
Как это работает:
Lombok генерирует методы equals() и hashCode(), которые сравнивают объекты по их полям. Например:
Нюансы:
Можно исключить поля из сравнения с помощью параметра exclude:
Можно включить только определенные поля с помощью параметра of:
Как Lombok работает под капотом?
Lombok использует механизм обработки аннотаций (Annotation Processing) на этапе компиляции. Вот как это работает:
Компиляция Java-кода:
Когда вы компилируете код, компилятор Java (javac) запускает процессоры аннотаций.
Lombok подключается как процессор аннотаций.
Генерация кода:
Lombok анализирует аннотации в вашем коде.
На основе аннотаций Lombok генерирует дополнительные методы (например, геттеры, сеттеры, toString()).
Добавление в байт-код:
Сгенерированные методы добавляются в байт-код (.class файлы), но не отображаются в исходном коде.
Пример байт-кода:
Если вы используете @Getter, Lombok добавит методы getName() и getAge() в байт-код, но в исходном коде их не будет.
Нюансы использования Lombok
Зависимость от Lombok:
Все разработчики проекта должны использовать Lombok, иначе код не скомпилируется.
Убедитесь, что Lombok настроен в вашей IDE.
Совместимость с другими библиотеками:
Lombok может конфликтовать с некоторыми библиотеками, например, с Jackson или Hibernate. В таких случаях нужно быть осторожным с аннотациями.
Отладка:
Поскольку сгенерированный код не отображается в исходниках, отладка может быть сложнее. Убедитесь, что ваша IDE поддерживает Lombok.
Кастомизация:
Lombok предоставляет множество параметров для настройки аннотаций, таких как уровень доступа, исключение полей и т.д.
#Java #Training #Spring #Lombok #EqualsAndHashCode
Аннотация @EqualsAndHashCode
Эта аннотация автоматически генерирует методы equals() и hashCode(), которые используются для сравнения объектов.
Пример:
import lombok.EqualsAndHashCode;
@EqualsAndHashCode
public class User {
private String name;
private int age;
}
Как это работает:
Lombok генерирует методы equals() и hashCode(), которые сравнивают объекты по их полям. Например:
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
User user = (User) o;
return age == user.age && Objects.equals(name, user.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
Нюансы:
Можно исключить поля из сравнения с помощью параметра exclude:
@EqualsAndHashCode(exclude = "age")
public class User {
private String name;
private int age;
}
Можно включить только определенные поля с помощью параметра of:
@EqualsAndHashCode(of = "name")
public class User {
private String name;
private int age;
}
Как Lombok работает под капотом?
Lombok использует механизм обработки аннотаций (Annotation Processing) на этапе компиляции. Вот как это работает:
Компиляция Java-кода:
Когда вы компилируете код, компилятор Java (javac) запускает процессоры аннотаций.
Lombok подключается как процессор аннотаций.
Генерация кода:
Lombok анализирует аннотации в вашем коде.
На основе аннотаций Lombok генерирует дополнительные методы (например, геттеры, сеттеры, toString()).
Добавление в байт-код:
Сгенерированные методы добавляются в байт-код (.class файлы), но не отображаются в исходном коде.
Пример байт-кода:
Если вы используете @Getter, Lombok добавит методы getName() и getAge() в байт-код, но в исходном коде их не будет.
Нюансы использования Lombok
Зависимость от Lombok:
Все разработчики проекта должны использовать Lombok, иначе код не скомпилируется.
Убедитесь, что Lombok настроен в вашей IDE.
Совместимость с другими библиотеками:
Lombok может конфликтовать с некоторыми библиотеками, например, с Jackson или Hibernate. В таких случаях нужно быть осторожным с аннотациями.
Отладка:
Поскольку сгенерированный код не отображается в исходниках, отладка может быть сложнее. Убедитесь, что ваша IDE поддерживает Lombok.
Кастомизация:
Lombok предоставляет множество параметров для настройки аннотаций, таких как уровень доступа, исключение полей и т.д.
#Java #Training #Spring #Lombok #EqualsAndHashCode
Всем доброго субботнего утра! 🖐
Как пробник рабочей недели прошел?😉
Постараюсь все-таки на завтра подготовить Вам Spring Security...😜
А в остальном, всем плодотворных выходных!💪
Как пробник рабочей недели прошел?
Постараюсь все-таки на завтра подготовить Вам Spring Security...
А в остальном, всем плодотворных выходных!
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
Все бывает в первый раз 😂 🤪🤫
Please open Telegram to view this post
VIEW IN TELEGRAM
Уффф... 🥴
Я подготовился!😙
Жду Вас в 16:00 по МСК на встречу!
Расскажу все что смогу про Spring Security. Напишем реализации доступные на локальной системе и обязательно Jwt через заголовок и cookies...🔪
Жду всех!🤜
Я подготовился!
Жду Вас в 16:00 по МСК на встречу!
Расскажу все что смогу про Spring Security. Напишем реализации доступные на локальной системе и обязательно Jwt через заголовок и cookies...
Жду всех!
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Разбираем Spring Security. Аутентификация через JWT-токен. Встреча от 12.01.2025
Запись нашей встречи -
YOUTUBE
RUTUBE
На сегодняшней встрече мы разобрали на примере работу Spring Security:
— Рассмотрели теоретическую часть аутентификации и авторизации.
— Реализовали аутентификацию через форму и через HTTP Basic Authentication
— Рассмотрели 2 варианта аутентификации через JWT - токен, в Header и при сохранении в Cookies
— Обязательно поискали неочевидную ошибку 😂 🤦♂️
Код на GitHub - https://github.com/Oleborn/WebTasksManager.git
Отдельное спасибо тем кто смог прийти и помогал по мере возникновения проблем.😏
Тем кто попытался досмотреть до конца, но не смог - тоже моя благодарность🙂
Смотрите, комментируйте, задавайте вопросы! Обязательно подписывайтесь на ютуб и рутюб каналы!!!
Всем хорошего настроения!🤘 🔫
Запись нашей встречи -
YOUTUBE
RUTUBE
На сегодняшней встрече мы разобрали на примере работу Spring Security:
— Рассмотрели теоретическую часть аутентификации и авторизации.
— Реализовали аутентификацию через форму и через HTTP Basic Authentication
— Рассмотрели 2 варианта аутентификации через JWT - токен, в Header и при сохранении в Cookies
— Обязательно поискали неочевидную ошибку 😂 🤦♂️
Код на GitHub - https://github.com/Oleborn/WebTasksManager.git
Отдельное спасибо тем кто смог прийти и помогал по мере возникновения проблем.
Тем кто попытался досмотреть до конца, но не смог - тоже моя благодарность
Смотрите, комментируйте, задавайте вопросы! Обязательно подписывайтесь на ютуб и рутюб каналы!!!
Всем хорошего настроения!
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Аннотации для конструкторов
Аннотация @NoArgsConstructor
Эта аннотация генерирует конструктор без параметров (конструктор по умолчанию).
Пример использования:
Как это работает:
Lombok генерирует конструктор User() во время компиляции. Этот конструктор инициализирует объект без установки значений полей.
Нюансы:
Если в классе есть final-поля, то @NoArgsConstructor вызовет ошибку компиляции, так как final-поля должны быть инициализированы. В таком случае можно использовать параметр force, чтобы обнулить final-поля:
Аннотация @AllArgsConstructor
Эта аннотация генерирует конструктор со всеми параметрами для всех полей класса.
Пример использования:
Как это работает:
Lombok генерирует конструктор User(String name, int age), который принимает значения для всех полей класса.
Нюансы:
Если в классе есть static-поля, они не будут включены в конструктор, так как они принадлежат классу, а не объекту.
Можно использовать параметр staticName, чтобы создать статический фабричный метод вместо обычного конструктора:
Аннотация @RequiredArgsConstructor
Эта аннотация генерирует конструктор для обязательных полей. К обязательным полям относятся:
Поля с модификатором final.
Поля, аннотированные @NonNull.
Пример использования:
Как это работает:
Lombok генерирует конструктор User(String name), который принимает только обязательные поля (name в данном случае).
Нюансы:
Если поле @NonNull не инициализировано, Lombok добавит проверку на null в конструкторе:
Можно использовать параметр staticName, чтобы создать статический фабричный метод:
#Java #Training #Spring #Lombok #AllArgsConstructor #NoArgsConstructor #RequiredArgsConstructor
Аннотация @NoArgsConstructor
Эта аннотация генерирует конструктор без параметров (конструктор по умолчанию).
Пример использования:
import lombok.NoArgsConstructor;
@NoArgsConstructor
public class User {
private String name;
private int age;
}
Как это работает:
Lombok генерирует конструктор User() во время компиляции. Этот конструктор инициализирует объект без установки значений полей.
Нюансы:
Если в классе есть final-поля, то @NoArgsConstructor вызовет ошибку компиляции, так как final-поля должны быть инициализированы. В таком случае можно использовать параметр force, чтобы обнулить final-поля:
@NoArgsConstructor(force = true)
public class User {
private final String name = null; // final-поле будет инициализировано как null
private int age;
}
Аннотация @AllArgsConstructor
Эта аннотация генерирует конструктор со всеми параметрами для всех полей класса.
Пример использования:
import lombok.AllArgsConstructor;
@AllArgsConstructor
public class User {
private String name;
private int age;
}
Как это работает:
Lombok генерирует конструктор User(String name, int age), который принимает значения для всех полей класса.
Нюансы:
Если в классе есть static-поля, они не будут включены в конструктор, так как они принадлежат классу, а не объекту.
Можно использовать параметр staticName, чтобы создать статический фабричный метод вместо обычного конструктора:
@AllArgsConstructor(staticName = "of")
public class User {
private String name;
private int age;
}
// Использование:
User user = User.of("John", 30);
Аннотация @RequiredArgsConstructor
Эта аннотация генерирует конструктор для обязательных полей. К обязательным полям относятся:
Поля с модификатором final.
Поля, аннотированные @NonNull.
Пример использования:
import lombok.RequiredArgsConstructor;
import lombok.NonNull;
@RequiredArgsConstructor
public class User {
@NonNull
private final String name;
private int age;
}
Как это работает:
Lombok генерирует конструктор User(String name), который принимает только обязательные поля (name в данном случае).
Нюансы:
Если поле @NonNull не инициализировано, Lombok добавит проверку на null в конструкторе:
public User(@NonNull String name) {
if (name == null) {
throw new NullPointerException("name is marked non-null but is null");
}
this.name = name;
}
Можно использовать параметр staticName, чтобы создать статический фабричный метод:
@RequiredArgsConstructor(staticName = "of")
public class User {
@NonNull
private final String name;
private int age;
}
// Использование:
User user = User.of("John");
#Java #Training #Spring #Lombok #AllArgsConstructor #NoArgsConstructor #RequiredArgsConstructor
Что выведет код?
#Tasks
public class Task130125_1 {
public static void main(String[] args) {
String s = "hello";
s.concat(" world");
s.replace("hello", "hi");
System.out.println(s);
}
}
#Tasks