Telegram Group & Telegram Channel
🧠 Хитрая задача для Java-разработчиков: “Зеркальная фабрика”

📌 Условие:

Реализуйте абстрактную фабрику MirrorFactory, которая:
- При создании объекта класса T возвращает прокси, который повторяет все методы оригинального объекта
- Но дополнительно логирует имя каждого вызванного метода и автоматически вызывает метод с тем же именем у другого объекта (его зеркала)

🎯 Иными словами:


MyService original = new MyService();
MyService mirror = new MyService();

MyService proxy = MirrorFactory.create(original, mirror);
proxy.doWork();
// Лог:
// doWork() called
// original.doWork() вызван
// mirror.doWork() вызван

❗️**Ограничения:**

- Классы могут быть любыми, но должны реализовывать интерфейсы
- Использовать только стандартные средства Java (рефлексия, Proxy, `InvocationHandler`)
- Методы с одинаковым именем и сигнатурой должны быть вызваны у обоих объектов

Решение:

```java
import java.lang.reflect.*;

public class MirrorFactory {
@SuppressWarnings("unchecked")
public static <T> T create(T original, T mirror) {
Class<?> clazz = original.getClass().getInterfaces()[0];
return (T) Proxy.newProxyInstance(
clazz.getClassLoader(),
new Class[]{clazz},
new InvocationHandler() {
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println(method.getName() + "() called");
Object result1 = method.invoke(original, args);
Object result2 = method.invoke(mirror, args);
return result1; // приоритет оригиналу
}
});
}
}
```

Пример использования:

```java
interface MyService {
void doWork();
}

class MyServiceImpl implements MyService {
public void doWork() {
System.out.println("Working: " + this);
}
}
```

🔍 **Подвох:**

- Java `Proxy` работает **только с интерфейсами**
- Метод вызывается **дважды** — нужно быть осторожным с побочными эффектами
- Возврат значения только одного вызова (`original`) — важно, если метод что-то возвращает

🧠 **Чему учит задача:**

- Глубокому пониманию `java.lang.reflect.Proxy`
- Поведению `InvocationHandler` и сигнатур
- Умению комбинировать дизайн-паттерн **Proxy** и **Decorator**
- Практике метапрограммирования и логирования без изменения кода класса

---

@javatg



tg-me.com/javatg/1829
Create:
Last Update:

🧠 Хитрая задача для Java-разработчиков: “Зеркальная фабрика”

📌 Условие:

Реализуйте абстрактную фабрику MirrorFactory, которая:
- При создании объекта класса T возвращает прокси, который повторяет все методы оригинального объекта
- Но дополнительно логирует имя каждого вызванного метода и автоматически вызывает метод с тем же именем у другого объекта (его зеркала)

🎯 Иными словами:


MyService original = new MyService();
MyService mirror = new MyService();

MyService proxy = MirrorFactory.create(original, mirror);
proxy.doWork();
// Лог:
// doWork() called
// original.doWork() вызван
// mirror.doWork() вызван

❗️**Ограничения:**

- Классы могут быть любыми, но должны реализовывать интерфейсы
- Использовать только стандартные средства Java (рефлексия, Proxy, `InvocationHandler`)
- Методы с одинаковым именем и сигнатурой должны быть вызваны у обоих объектов

Решение:

```java
import java.lang.reflect.*;

public class MirrorFactory {
@SuppressWarnings("unchecked")
public static <T> T create(T original, T mirror) {
Class<?> clazz = original.getClass().getInterfaces()[0];
return (T) Proxy.newProxyInstance(
clazz.getClassLoader(),
new Class[]{clazz},
new InvocationHandler() {
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println(method.getName() + "() called");
Object result1 = method.invoke(original, args);
Object result2 = method.invoke(mirror, args);
return result1; // приоритет оригиналу
}
});
}
}
```

Пример использования:

```java
interface MyService {
void doWork();
}

class MyServiceImpl implements MyService {
public void doWork() {
System.out.println("Working: " + this);
}
}
```

🔍 **Подвох:**

- Java `Proxy` работает **только с интерфейсами**
- Метод вызывается **дважды** — нужно быть осторожным с побочными эффектами
- Возврат значения только одного вызова (`original`) — важно, если метод что-то возвращает

🧠 **Чему учит задача:**

- Глубокому пониманию `java.lang.reflect.Proxy`
- Поведению `InvocationHandler` и сигнатур
- Умению комбинировать дизайн-паттерн **Proxy** и **Decorator**
- Практике метапрограммирования и логирования без изменения кода класса

---

@javatg

BY Java


Warning: Undefined variable $i in /var/www/tg-me/post.php on line 283

Share with your friend now:
tg-me.com/javatg/1829

View MORE
Open in Telegram


Java Telegram | DID YOU KNOW?

Date: |

That growth environment will include rising inflation and interest rates. Those upward shifts naturally accompany healthy growth periods as the demand for resources, products and services rise. Importantly, the Federal Reserve has laid out the rationale for not interfering with that natural growth transition.It's not exactly a fad, but there is a widespread willingness to pay up for a growth story. Classic fundamental analysis takes a back seat. Even negative earnings are ignored. In fact, positive earnings seem to be a limiting measure, producing the question, "Is that all you've got?" The preference is a vision of untold riches when the exciting story plays out as expected.

Importantly, that investor viewpoint is not new. It cycles in when conditions are right (and vice versa). It also brings the ineffective warnings of an overpriced market with it.Looking toward a good 2022 stock market, there is no apparent reason to expect these issues to change.

Java from ca


Telegram Java
FROM USA