Java循环参考 - 无法编译

时间:2013-08-13 20:31:28

标签: java circular-dependency

档案:A.java

class A
{
    B b;
    public A() {
        b = new B();
    }
}

档案:B.java

class B
{
    public B() {}
    public foo(A a) {...}
}

上面的代码无法编译,因为A需要B才能编译,B需要A才能编译。也不要在另一个之前编译。现在怎么样?

这个例子很简单。我可以删除foo(A a){...}这样的B.java会编译。然后编译A.java。恢复B.java然后编译它。但是我正在尝试从源代码构建RXTX,它的依赖性是一个曲折的小短语迷宫。

我原本希望能编译成非工作类代码。然后定义所有类和方法再次编译成工作代码。

是否有灵丹妙药?

3 个答案:

答案 0 :(得分:6)

如果你一次编译它们,它们应该编译好:

javac A.java B.java

答案 1 :(得分:3)

如果您使用Java IDE(Eclipse或Netbeans等)或ant构建脚本等,则没有编译问题(主要的是使用javac命令时它应该是正确的类路径)。

或者如果您使用*.java从命令行进行编译,javac比这更聪明;)

javac -classpath ... *.java

Java编译器在您的类路径中工作,这是Java中的第1条规则!

如果您使用A和B源代码,并使用正确的类路径进行编译,那么javac任务就没有问题。

如果你只编译你的第一个类(A或B),Java编译器将在类路径中搜索所请求的类(如导入中所指定的,如果没有给出导入包,那么类路径应该是选定的课程。)

  

如果A.java和B.java在同一个包中,那么你运行 javac -classpath。 A.java 这应该会导致A.class和B.class。

     

如果A.java在包x中,而包y中包含B,那么在编译期间当然应该使用两个类路径。 javac -classpath x; y;。; A.java (如果尚未编译,它甚至会编译B.java!)

答案 2 :(得分:0)

或者,通过使用界面打破循环依赖 - 当然,如果这种情况适用于你的情况。

c.java:

public interface C {...};

B.java:

public class B implements C {...};

A.java:

class A
{
    C b;
    public A() {
        b = // use a factory here, returning a C reference
    }
}

因此,在编译时,A和B都依赖于C - 而不是彼此