Вопросы с собеседования 👩💻
Что такое 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
Вопросы с собеседования 👩💻
Что такое ArrayList?
Что такое ArrayList?
Anonymous Quiz
76%
Это динамический массив, который может изменять свой размер.
11%
Это массив фиксированного размера.
4%
Это потокобезопасная коллекция.
9%
Это интерфейс для работы с коллекциями.
Please open Telegram to view this post
VIEW IN TELEGRAM
Аннотации для управления состоянием
Комбинированная аннотация @Data и нюансы использования
Аннотация @Data
Эта аннотация объединяет функциональность нескольких аннотаций:
@Getter и @Setter для всех полей.
@ToString для генерации метода toString().
@EqualsAndHashCode для генерации методов equals() и hashCode().
@RequiredArgsConstructor для генерации конструктора с обязательными полями.
Пример использования:
Как это работает:
Lombok генерирует следующие методы и конструктор:
Геттеры и сеттеры для всех полей.
Метод toString().
Методы equals() и hashCode().
Конструктор для обязательных полей (если такие есть).
Пример сгенерированного кода:
Нюансы:
Если в классе есть final-поля или поля с @NonNull, Lombok добавит конструктор для этих полей.
Аннотация @Data не генерирует конструктор по умолчанию (@NoArgsConstructor), если в классе есть final-поля.
Можно комбинировать @Data с другими аннотациями, например, @Builder, чтобы добавить дополнительные возможности.
#Java #Training #Spring #Lombok #Data
Комбинированная аннотация @Data и нюансы использования
Аннотация @Data
Эта аннотация объединяет функциональность нескольких аннотаций:
@Getter и @Setter для всех полей.
@ToString для генерации метода toString().
@EqualsAndHashCode для генерации методов equals() и hashCode().
@RequiredArgsConstructor для генерации конструктора с обязательными полями.
Пример использования:
import lombok.Data;
@Data
public class User {
private String name;
private int age;
}
Как это работает:
Lombok генерирует следующие методы и конструктор:
Геттеры и сеттеры для всех полей.
Метод toString().
Методы equals() и hashCode().
Конструктор для обязательных полей (если такие есть).
Пример сгенерированного кода:
public class User {
private String name;
private int age;
public User() {}
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=" + this.name + ", age=" + this.age + ")";
}
@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);
}
}
Нюансы:
Если в классе есть final-поля или поля с @NonNull, Lombok добавит конструктор для этих полей.
Аннотация @Data не генерирует конструктор по умолчанию (@NoArgsConstructor), если в классе есть final-поля.
Можно комбинировать @Data с другими аннотациями, например, @Builder, чтобы добавить дополнительные возможности.
#Java #Training #Spring #Lombok #Data
Аннотации для работы с коллекциями
Аннотация @Builder
Эта аннотация реализует паттерн Builder, который позволяет создавать объекты через цепочку вызовов. Это особенно полезно для классов с большим количеством полей.
Пример использования:
Как это работает:
Lombok генерирует внутренний класс UserBuilder с методами для каждого поля. В результате вы можете создавать объекты через цепочку вызовов, что делает код более читаемым.
Сгенерированный код:
Нюансы:
Можно использовать параметр builderMethodName, чтобы изменить имя метода builder():
Аннотация @Singular
Эта аннотация используется вместе с @Builder для удобного добавления элементов в коллекции. Она генерирует методы для добавления элементов по одному.
Пример использования:
Как это работает:
Lombok генерирует методы для добавления элементов в коллекцию. Например, для поля hobbies будет создан метод hobby(String hobby).
Сгенерированный код:
Нюансы:
Lombok автоматически определяет тип коллекции и генерирует соответствующие методы.
Можно использовать параметр value, чтобы изменить имя метода:
#Java #Training #Spring #Lombok #Singular #Builder
Аннотация @Builder
Эта аннотация реализует паттерн Builder, который позволяет создавать объекты через цепочку вызовов. Это особенно полезно для классов с большим количеством полей.
Пример использования:
import lombok.Builder;
@Builder
public class User {
private String name;
private int age;
}
// Использование:
User user = User.builder()
.name("John")
.age(30)
.build();
Как это работает:
Lombok генерирует внутренний класс UserBuilder с методами для каждого поля. В результате вы можете создавать объекты через цепочку вызовов, что делает код более читаемым.
Сгенерированный код:
public class User {
private String name;
private int age;
User(String name, int age) {
this.name = name;
this.age = age;
}
public static UserBuilder builder() {
return new UserBuilder();
}
public static class UserBuilder {
private String name;
private int age;
UserBuilder() {}
public UserBuilder name(String name) {
this.name = name;
return this;
}
public UserBuilder age(int age) {
this.age = age;
return this;
}
public User build() {
return new User(name, age);
}
}
}
Нюансы:
Можно использовать параметр builderMethodName, чтобы изменить имя метода builder():
@Builder(builderMethodName = "create")
public class User {
private String name;
private int age;
}
// Использование:
User user = User.create().name("John").age(30).build();
Если класс содержит final-поля, Lombok автоматически добавит их в билдер.
Аннотация @Singular
Эта аннотация используется вместе с @Builder для удобного добавления элементов в коллекции. Она генерирует методы для добавления элементов по одному.
Пример использования:
import lombok.Builder;
import lombok.Singular;
import java.util.List;
@Builder
public class User {
private String name;
@Singular
private List<String> hobbies;
}
// Использование:
User user = User.builder()
.name("John")
.hobby("Reading")
.hobby("Swimming")
.build();
Как это работает:
Lombok генерирует методы для добавления элементов в коллекцию. Например, для поля hobbies будет создан метод hobby(String hobby).
Сгенерированный код:
public class User {
private String name;
private List<String> hobbies;
User(String name, List<String> hobbies) {
this.name = name;
this.hobbies = hobbies;
}
public static UserBuilder builder() {
return new UserBuilder();
}
public static class UserBuilder {
private String name;
private List<String> hobbies = new ArrayList<>();
UserBuilder() {}
public UserBuilder name(String name) {
this.name = name;
return this;
}
public UserBuilder hobby(String hobby) {
this.hobbies.add(hobby);
return this;
}
public User build() {
return new User(name, hobbies);
}
}
}
Нюансы:
Lombok автоматически определяет тип коллекции и генерирует соответствующие методы.
Можно использовать параметр value, чтобы изменить имя метода:
@Singular("interest")
private List<String> hobbies;
// Использование:
User user = User.builder().interest("Reading").interest("Swimming").build();
#Java #Training #Spring #Lombok #Singular #Builder
Что выведет код?
#Tasks
package oleborn.taskswithspring.tasks.year2025;
class A {
void print() {
System.out.println("A");
}
}
class B extends A {
void print() {
System.out.println("B");
}
}
class C extends B {
void print() {
System.out.println("C");
}
}
public class Task140125_1 {
public static void main(String[] args) {
A a = new C();
B b = (B) a;
b.print();
}
}
#Tasks
Вопросы с собеседования 👩💻
Что такое HashMap?
Что такое HashMap?
Anonymous Quiz
4%
Это коллекция, которая хранит элементы в порядке добавления.
2%
Это потокобезопасная коллекция.
4%
Это интерфейс для работы с коллекциями.
89%
Это коллекция, которая хранит пары ключ-значение.
Please open Telegram to view this post
VIEW IN TELEGRAM