【问题标题】:Java: Forward declarations of classes in namespacesJava:命名空间中类的前向声明
【发布时间】:2010-03-10 14:39:11
【问题描述】:

如何在 Java 中进行前向声明?

我有两个类,每个类都需要调用另一个类中的一个方法,它们都位于不同的命名空间中。比如……

package one;

class A {
    public void foo() {
        B b = new B();
        b.bah();
    }
}

package two;

class B {
    public void bah() {
        A a = new A();
        a.foo();
    }
}

更新

在 Eclipse 中遇到此代码时会抛出编译时错误“在构建路径中检测到循环...”。

【问题讨论】:

  • 我认为这只是您提供的一个示例,并且您知道它会导致 StackOverflowError?
  • 另请注意,这通常表明您的设计存在一些问题。依赖关系通常应该只在一个方向上。

标签: java forward-declaration


【解决方案1】:

只需导入它们。在这些方面,Java 比 C++ 聪明得多。

【讨论】:

  • 导入的顺序在 Java 中并不重要。无需任何额外代码即可实现循环引用。
【解决方案2】:

在 Eclipse 中遇到此代码时会抛出编译时错误“在构建路径中检测到循环...”。

我认为 Eclipse 抱怨是因为您在工作区中的不同 Eclipse 项目中的类之间存在循环依赖关系。 Eclipse 希望能够以线性顺序构建项目。

如果你把相互依赖的类放到同一个项目中,Eclipse 会很高兴。

【讨论】:

    【解决方案3】:

    好吧,你导入类:

    package one;
    
    import two.B;
    
    class A {
        public void foo() {
            new B().bah();
        }
    }
    

    或使用他们的全名:

    package one;
    
    class A {
        public void foo() {
            new two.B().bah();
        }
    }
    

    但是,不用说,这将导致抛出异常(至少,在您发布的 sn-p 中......)。

    【讨论】:

    • @Ben,是的,我以为你知道,但想确定一下。
    【解决方案4】:

    鉴于这里的 cmets(即,您不需要做显式的前向声明,因为编译器可以应付)我已将 Eclipse 错误降级为警告,并且必须忽略它。

    为此,请转到...

    Window > Preferences > Java > Compiler > Building > Build path questions > 循环依赖

    【讨论】:

    • 肯定 Eclipse 会警告您,如果您运行此代码,您将收到 StackOverflowError?或者你的真实代码是否有某种中断条件会停止连续循环?
    • 这不是“真正的代码”,它只是描述我的问题的一些代码示例。
    猜你喜欢
    • 2012-12-27
    • 1970-01-01
    • 2012-12-15
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    • 2015-05-10
    • 1970-01-01
    • 2011-09-20
    相关资源
    最近更新 更多