Java类是否可以了解其实例化器?

时间:2010-03-01 16:36:42

标签: java constructor

Java类是否有办法了解其实例化器?例如:

public class Foo() {

    public Foo() {
        // can I get Bar.myInteger from here somehow 
        // without passing it in to the constructor?
    }
}

public class Bar {
    private int myInteger;

    public Bar() {
        myInteger = 0;

        Foo foo = new Foo();
    }
}

11 个答案:

答案 0 :(得分:8)

您是否有任何特殊原因想要在构造函数中传递任何内容?

简单地说,这违反了封装原则......也可能违反其他几个原则。

答案 1 :(得分:5)

对于内部课程,你可以。

public class Bar {

   private int myInteger;

   public class Foo() {

        public Foo() {
             // you can access myInteger
        }
    }


    public Bar() {
        myInteger = 0;
        Foo foo = new Foo();
    }
}

答案 2 :(得分:2)

不,你不能。

你想做什么?

答案 3 :(得分:2)

您可以通过堆栈跟踪获取一些信息:

Throwable t = new Throwable();
t.fillInStackTrace();
StackTraceElement[] stt = t.getStackTrace();

然后探索stt[]

的元素

答案 4 :(得分:2)

您无法以您希望的方式访问它。但是在这里使用inner class可能是合适的,具体取决于您要解决的问题。内部类可以访问外部变量的私有变量。

答案 5 :(得分:0)

如果它们位于同一个程序包中,您可以将myInteger的访问级别更改为受保护,Foo可以直接访问它,但您仍需要Bar的引用,除非{{1}也是静态的。我不喜欢这样做,这使得他们更难测试。

除此之外,您的选项在实例化Foo或将其传递给构造函数后使用setter。

答案 6 :(得分:0)

如果您提供getter / setter函数,则只能显式将其传递给构造函数,才能访问另一个类的私有成员。所以你的问题的答案是否定的。

答案 7 :(得分:0)

您可以强制“Instantiators”使用Factory。但无论如何,请求新实例的对象的“身份”应作为参数传递。

小心定义您想要追踪的身份。实例ID?班级ID?

答案 8 :(得分:0)

如果Foo是Bar的内部类,它可以看到Bar的成员。

答案 9 :(得分:0)

你可以使用内部类,如下所示:


public class Bar {
    private int myInteger;
    public Bar() {
        myInteger = 0;
        Foo foo = new Foo();
    }
    class Foo {
        Foo() {
            int i = Bar.this.myInteger;
        }
    }
}

问候。

答案 10 :(得分:0)

保持简单......
1。 如果Foo总是需要知道来自Bar的myInteger,那么将它传递给构造函数 2。 如果Foo偶尔需要知道myInteger,那么在构造函数之后调用一个setter。

如果Foo需要的不仅仅是myInteger,即整个Bar对象,那么Bar可以使用“this”关键字传递给自己。

public class Foo
{
  public Foo(Bar bar)
  { 
    //Do something with Bar 
  }
}

// Bar中的某个地方(采用非静态方法)
    new Foo(this);