繁体   English   中英

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

[英]Can I compile two interdependent class in Java?

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

实用工具

package yao;
import yao.gate.Gate;

Gate.java

package yao.gate;
import yao.Utils;

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

有可能的。 但是,这听起来不是一个好的设计。 创建一个新类,然后将通用代码移至该类,并删除两个类之间的相互依赖性。

正如@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。 它可以编译,但最终在运行时导致堆栈溢出

在此处输入图片说明

两个相互依赖的类可以根据其复杂程度进行编译。 例如,拥有两个相互调用方法的类不是一个好设计。 这将导致死锁代码。 例如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();
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM