В Java можно динамически изменять поведение объектов, используя
InvocationHandler и Proxy.🗣️ Это полезно для создания прокси-объектов, которые могут оборачивать существующие объекты и добавлять новые функции, такие как логирование, кеширование или контроль доступа.
• InvocationHandler позволяет перехватывать вызовы методов у прокси-объекта и добавлять дополнительное поведение, такое как логирование.• Использование Proxy позволяет динамически создавать новый объект, который ведет себя как реальный объект, но с добавленным поведением.• Этот подход позволяет добавлять новое поведение к существующим объектам без изменения их кода, что делает его мощным инструментом для реализации аспектно-ориентированного программирования (AOP).Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
❓Какая строка на изображении выше успешно скомпилируется?
Anonymous Quiz
10%
// 1
11%
// 2
12%
// 3
12%
// 4
6%
// 5
9%
// 6
41%
Никакая
Сколько строк выведет этот код?
Anonymous Quiz
12%
0. Этот код не скомпилируется
3%
1
17%
2
59%
3
6%
4
4%
Узнать ответ
👍6🔥1
❓Что из вариантов лучше всего описывается определением: Операция, которая содержит серию задач, которые должны быть выполнены либо все, либо не выполнена ни одн
#spring
#spring
❓Что из вариантов лучше всего описывается определением: Операция, которая содержит серию задач, которые должны быть выполнены либо все, либо не выполнена ни одна.
Anonymous Quiz
5%
Query
84%
Transaction
8%
Prepared statement
3%
Callback
☕ Java-баг, который выглядит нормально, но ломает `HashMap`
Что выведет этот код?
Многие ожидают:
Но результат:
```text
null
```
Почему?
ищет ключ через:
```java
hashCode()
equals()
```
Когда мы сделали:
```java
map.put(key, "Ritesh");
```
ключ был:
```text
[1, 2]
```
У него был один .
Но потом:
```java
key.add(3);
```
ключ стал:
```text
[1, 2, 3]
```
И его изменился.
уже положил объект в bucket по старому hash, а при ищет по новому.
Схема:
```text
put()
[1,2]
hash = X
↓
bucket X
key.add(3)
[1,2,3]
hash = Y
get()
ищем bucket Y
→ запись не найдена
```
Главное правило:
❌ Не изменяйте объект после того, как использовали его как ключ в .
Лучше использовать:
✅
✅
✅
✅ immutable-объекты
Например:
```java
Map<List<Integer>, String> map = new HashMap<>();
List<Integer> key = List.of(1, 2);
map.put(key, "value");
```
Самые опасные баги в Java - те, где объект всё ещё существует, ссылка всё та же, но структура данных уже не может его нормально найти.
#java #backend #programming
Что выведет этот код?
Map<List<Integer>, String> map = new HashMap<>();
List<Integer> key = new ArrayList<>(List.of(1, 2));
map.put(key, "Ritesh");
key.add(3);
System.out.println(map.get(key));
Многие ожидают:
Ritesh
Но результат:
```text
null
```
Почему?
HashMap```java
hashCode()
equals()
```
Когда мы сделали:
```java
map.put(key, "Ritesh");
```
ключ был:
```text
[1, 2]
```
У него был один
hashCodeНо потом:
```java
key.add(3);
```
ключ стал:
```text
[1, 2, 3]
```
И его
hashCodeHashMapget()Схема:
```text
put()
[1,2]
hash = X
↓
bucket X
key.add(3)
[1,2,3]
hash = Y
get()
ищем bucket Y
→ запись не найдена
```
Главное правило:
❌ Не изменяйте объект после того, как использовали его как ключ в
HashMapЛучше использовать:
✅
String✅
Integer✅
record✅ immutable-объекты
Например:
```java
Map<List<Integer>, String> map = new HashMap<>();
List<Integer> key = List.of(1, 2);
map.put(key, "value");
```
Самые опасные баги в Java - те, где объект всё ещё существует, ссылка всё та же, но структура данных уже не может его нормально найти.
❤2
❤5