档案: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,它的依赖性是一个曲折的小短语迷宫。
我原本希望能编译成非工作类代码。然后定义所有类和方法再次编译成工作代码。
是否有灵丹妙药?
答案 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 - 而不是彼此