代码之家  ›  专栏  ›  技术社区  ›  xenonite

如何在java中将自引用传递给构造函数?

  •  1
  • xenonite  · 技术社区  · 16 年前

    我有一个类a需要实例化第二个类B,它的构造函数需要引用类a的同一个对象。。。

    看起来像:

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

    好吧,eclipse一直抱怨这是不可能的。我想,这是因为A级的引用目前还没有准备好。。。? 但是如果我把B类的init移到一个单独的函数中,我会从“outside”调用它,这个错误就不会消失。。。

    4 回复  |  直到 16 年前
        1
  •  10
  •   Edwin Buck    16 年前

    要非常小心,因为在构造之前,它实际上并不存在。如果B要调用a上的方法,程序应该失败,因为在构造a之前不能调用a上的方法。只有从构造函数代码完全返回时,构造才会完成。

    如果必须在每次构造A时用A初始化B,那么最好为A创建一个工厂类,保证在构造A之后初始化B。它看起来像这样

    public class AFactory {
    
      public A newA() {
        A a = new A();
        B b = new B(a);
        return a;
      }
    
    }
    

    要使其100%正常工作,可能需要限制A()构造函数的可见性。我个人认为 AFactory 放入与 A 并将访问设为“default”或“package private”,如下所示

    package same.as.afactory;
    
    public class A {
      A() {
        ...
      }
    }
    
        2
  •  5
  •   Amadan    16 年前

    我会问自己:你确定这就是你想要的设计吗?如果是的话,其中一个类成为另一个类的内部类有意义吗?

        3
  •  1
  •   Community Mohan Dere    9 年前

    看,这里有一种在构造函数本身中使用构造的自实例的方法:

    public class Foo {
        private int x;
    
        public Foo() {
            this(1);
            // the self instance should have been constructed now
        }
    
         public Foo(int x) {
            this.x = x;
         }
    }
    

    How do I call one constructor from another in Java?

        4
  •  0
  •   Thorbjørn Ravn Andersen    16 年前