У меня есть два класса (A и B), которые зависят друг от друга в следующем смысле:
У каждого класса есть метод, выполняющий какое-то действие.
Действие каждого класса зависит от действия другого класса.
Итак, если пользователь вызывает действие класса A, он должен автоматически вызвать
действие класса B.
То же самое для другого пути. Но бесконечный цикл должен быть предотвращен.
Я нашел код, который решает эту проблему, но, похоже, это
немного тупой для меня: бесконечный цикл предотвращается блокировкой .
import java.util.concurrent.locks.*;
import static java.lang.System.*;
import org.junit.*;
public class TEST_DependentActions {
static class A {
private B b = null;
private final ReentrantLock actionOnBLock = new ReentrantLock();
public void setB(B b) {
this.b = b;
}
public void actionOnB() {
if (!actionOnBLock.isLocked()) {
actionOnBLock.lock();
b.actionOnA();
actionOnBLock.unlock();
}
}
}
static class B {
private A a = null;
private final ReentrantLock actionOnALock = new ReentrantLock();
public void setA(A a) {
this.a = a;
}
public void actionOnA() {
if (!actionOnALock.isLocked()) {
actionOnALock.lock();
a.actionOnB();
actionOnALock.unlock();
}
}
}
@Test
public void test1()
throws Exception {
out.println("acting on class A first:");
A a = new A(); B b = new B();
a.setB(b); b.setA(a);
a.actionOnB();
}
@Test
public void test2()
throws Exception {
out.println("acting on class B first:");
A a = new A(); B b = new B();
a.setB(b); b.setA(a);
b.actionOnA();
}
}
Вывод следующий:
acting on class A first:
A : calling class B's action.
B : calling class A's action.
acting on class B first:
B : calling class A's action.
A : calling class B's action.
Ну, это работает, но не кажется оптимальным решением.
Как бы вы сделали это?
Существует ли шаблон , который имеет дело с такой проблемой?
EDIT:
Я хочу знать это вообще.
Но скажем, у меня есть Контейнер , который содержит несколько Элементов с.
Контейнер предоставляет метод remove (someElement) и
Элемент также предоставляет метод removeMe () .
Оба метода зависят друг от друга, но не может быть подключен к одному
метод, потому что оба метода дополнительно выполняют некоторые внутренние вещи , что только
доступно внутри каждого класса.