我有一个简单的问题,但无法在任何地方找到参考文献中的解决方案。
当我创建某个类的实例时,实例将在每次重新创建时传播到几个地方,最明显的放置代码的地方是实例本身的创建方法。这就是它的样子:
public void MYTest() {
public MYTEST() {
ANOTHER_CLASS.myTest = this; // <-------- can I already use the new this and assign it ?
}
}
我可以将这个刚创建的实例的赋值放到创建方法中已经存在的其他变量中,还是必须写一个额外的&#34; super&#34;这样的创建方法也把它放在MYTEST中:
public void MYTest() {
public MYTEST() {
ANOTHER_CLASS.myTest = this; // <-------- can I already use the new this and assign it ?
}
public static MYTEST superCreationMethodForMYTEST() {
x = new MYTEST(); // <- here for sure the creation of MYTEST instance is finished BEFORE the assgnment happens
ANOTHER_ClASS.myTest = x;
.... all the other assignments for x.....
}
}
然后将其称为
x = MYTEST.superCreationMethodForMYTEST();
而不是:
x = new MYTEST();
由于
答案 0 :(得分:2)
您可以在构造函数中的任何位置分配this
引用。但是,根据您的情况,这可能不明智。主要问题是,虽然对象在构造函数时存在,但它并没有完全构造,因此可能不处于正确处理方法调用的状态。如果在构造函数(和任何子类构造函数)完成之前,毫无疑问的线程使用了指定的引用(或者由构造函数调用的方法),则可能会发生错误。
编辑添加:根据我的理解,您的问题是确保在请求创建对象的任何人接收新创建的对象之前,对对象的引用存储在特定位置。一个常见的模式基本上是你在你的问题中做的猜测,即有一个工厂方法(一个静态方法)使用new
来构造对象,然后将它存储在适当的位置。这确保仅存储对完全构造的对象的引用。同时,实际的构造函数被声明为private
或protected
,以防止在工厂方法之外意外使用new
。