Java类互相引用

Tom*_*mas 9 java class

我有两个java类文件.他们每个人都有另一个使用的方法.

public class class1{
    class2 c2 = new class2(); 
    m1(){
        c2.ma(); 
        m2();
    }
    m2(){}
}

public class class2{
    class1 c1 = new class1();
    ma(){}
    mb(){
        c1.m2();
    }
}
Run Code Online (Sandbox Code Playgroud)

线条

class1 c1 = new class1();  
Run Code Online (Sandbox Code Playgroud)

class2 c2 = new class2();  
Run Code Online (Sandbox Code Playgroud)

彼此引用导致无限循环,导致java.lang.StackOverflowError错误.

有没有办法让这些类相互引用,或者我别无选择,只能将我的所有方法转移到一个类中?

小智 6

如上所述,这是代码气味的标志.

之后有一个setter来设置方法并不令人满意,因为你有一个处于不确定状态的对象,直到调用setter.

尽管使用Spring之类的依赖框架可以帮助解决上述问题,但如果使用构造函数注入,那么您也不能拥有循环依赖关系!但至少在注入豆子时,你确定它不是一半构造的.

如果您不想使用依赖项注入框架,请考虑一个工厂模式,其中两个对象都是由工厂方法创建的,该方法返回一个元组(或者在Java的情况下对于元组没有本机支持的容器对象)完全构造的对象.

  • @ChetanKinger:也许,但你的答案都比我的好.作为第一个,我获得了更多选票,但这是错误的. (3认同)

CKi*_*ing 0

有没有某种方法可以让类相互引用,或者我别无选择,只能将所有方法转移到一个类中?

在我看来,循环引用是一种代码味道。请参阅答案以获取解释。请特别注意关于 的一点cognitive load

解决方案是让一个类依赖于另一个类,并将调用委托给另一个类:

public class class1{
    class2 c2 = new class2(); 
    m1(){
        c2.ma(); 
        m2();
    }
    m2(){}
}

public class class2{
    ma(){}
}
Run Code Online (Sandbox Code Playgroud)

这样,您并没有真正将所有方法转移到一个类中,而只是将其组合class2class1. 其他类依赖class1并且class2只需要依赖class1