对于需要相互调用的两种方法:如何防止无限循环?

iva*_*off 3 java design-patterns

我有两个类(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();
  }
}
Run Code Online (Sandbox Code Playgroud)

输出如下:

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.
Run Code Online (Sandbox Code Playgroud)

嗯,它有效,但似乎不是最佳解决方案.

你会怎么做?
是否存在处理此类问题的模式

编辑:
我想知道它一般.
但是,假设我有一个包含多个ElementContainer.Container提供方法remove(someElement),Element也提供方法removeMe(). 两种方法都相互依赖,但不能连接到一种方法,因为这两种方法还可以执行一些内部操作,只能每个类中访问.

Kri*_*ris 8

我会通过重新思考逻辑来处理这个问题.循环依赖通常表示某些东西有点......关闭.如果不能更深入地了解确切的问题,我就不能更具体了.