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();
}
}
答案 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);