我可以在Java中编译两个相互依赖的类吗?

时间:2017-03-27 06:36:29

标签: java package

我有两个文件,Utils.java和Gate.java。例如

Utils.java

package yao;
import yao.gate.Gate;

Gate.java

package yao.gate;
import yao.Utils;

Gate类使用Utils类的功能而Utills Class使用Gate类的功能。我可以编译这两个相互依赖的文件,还是应该考虑更改我的代码设计?如果可能的话,请告诉我该怎么做?

3 个答案:

答案 0 :(得分:1)

有可能。然而,这听起来不是一个好设计。 创建一个新类并将公共代码移动到该类,并删除两个类之间的相互依赖性。

答案 1 :(得分:0)

正如@Vlaxmi所提到的那样,根据一个代码如何调用另一个代码,可能会出现无法编译的情况。但至少有两种情况可以编译(没有编译错误)。假设我在类似的包配置中有两个类A和B,就像你描述的那样。

  • 案例1:来自A类实例的方法从类B的实例调用方法,而来自类B的另一个方法从类A调用不同的方法。在这种情况下,编译将很好并且执行

  • 案例2:来自C类实例的方法从类B的实例调用方法,而类B中的相同实例方法从类C调用相同的实例方法。编译将起作用很好,但执行将以StackOverflowError结束。

以下是代码中的插图

包相互依赖;

import interdependency.sub.*;
public class A {
    public void aM1() {
        System.out.println("In a.M1 method");
    }

    public void aM2() {
        System.out.println("In a.M2 method");
        B b = new B();
        b.bM2();
    }
}

这是B类:

package interdependency.sub;

import interdependency.A;

public class B {
    public void bM1() {
        System.out.println("In bM1 method:");
        A a = new A();
        a.aM1();
    }

    public void bM2() {
        System.out.println("In bM2 method");
    }
}

使用简单的类来运行此场景

包相互依赖;

import interdependency.sub.B;

public class InterdependencyTester {
    public static void main(String[] args) {
        A a = new A();
        B b = new B();
        a.aM1();
        a.aM2();
        b.bM1();
        b.bM2();
        C c = new C();
        c.cM1();
    }
}

在这个当前配置中,编译和执行都可以正常工作。 这是第二种情况,事情并不顺利,但编译仍然运行良好。

让我们假设某个C类与其他两个类似:

package interdependency;

import interdependency.sub.B;

public class C {
    public void cM1() {
        System.out.println("inside cM1");
        B b = new B();
        b.bM3();    
    }
}

现在让我们用第三种方法bM3

更新B.
package interdependency.sub;

import interdependency.A;
import interdependency.C;

public class B {
    public void bM1() {
        System.out.println("In bM1 method:");
        A a = new A();
        a.aM1();
    }

    public void bM2() {
        System.out.println("In bM2 method");
    }

    public void bM3() {
        System.out.println("In bM2 method");
        C c = new C();
        c.cM1();
    }
}

这次C.cM1呼叫B.bM3,B.bM3呼叫C.cM1。它编译但我们最终在运行时出现堆栈溢出

enter image description here

答案 2 :(得分:0)

两个相互依赖的类可以根据其具有的复杂程度进行编译。例如拥有两个方法相互调用的类并不是一个好的设计。这将导致死锁代码。 例如 Utils.java

package yao;

import yao.gate.Gate;

public class Utils {
    Gate gate = new Gate();
    public void testUtils(){
        System.out.println("testUtils");
        gate.gateMethod();
    }
}

Gate.java

package yao.gate;

import yao.Utils;


public class Gate {
    Utils util = new Utils();
    public void gateMethod(){
        util.testUtils();
    }
}