有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java通过接口打破Python中的循环依赖

下面的代码可用于打破Java中的循环依赖关系

什么是蟒蛇式的方式

interface A {
   int A1();
}


class X implements A {
   B b;

   public int X1() {
      b = B(this);
      b.doSomething();
   }

   public int A1() { ... }
}

class B {
   A a;
   public B(A a) {
      this.a = a;
   }

   public doSomething() {
      //...
      this.a.A1();
      //...
   }
}

共 (1) 个答案

  1. # 1 楼答案

    实现这一点最简单、也是最具python风格的方法是依赖duck类型,因此依赖关系在静态代码中不显式,也不存在循环性

    在Java中需要接口的原因是,Java强制B类为其a成员提供静态类型,同样地,为其构造函数提供a参数。Python中不需要这样做,因为变量没有类型(值当然有,但任何变量都可以包含任何类型的值)。如果您想显式强制检查,您可以使用^{}作为接口,可以,但它实际上并不能为您带来任何好处。最好让鸭子变成鸭子:

    class X(object):
        def x1(self):
            self.b = B(self)
            self.b.do_something()
        def a1(self):
            # ...
    
    class B(object):
        def __init__(self, a):
            self.a = a
        def do_something(self):
            self.a.a1()
    

    当然,仍然存在动态循环,但这不是问题。(嗯,循环引用可能是个问题,但通常不是,这不是您担心的问题,它与Java没有什么不同……)