When是一个被创建并可以被引用的对象



我有一个简单的问题,但在参考文献中找不到解决方案。

当我创建一个特定类的实例时,该实例将在每次创建时传播到几个地方,最明显的地方是将代码放在实例本身的创建方法中。它看起来是这样的:

    public void MYTest() {
    public MYTEST() {
         ANOTHER_CLASS.myTest = this; // <-------- can I already use the new this and assign it ?
        }
    }

我可以把这个新创建的实例的赋值给创建方法中已经存在的其他变量吗?还是我必须写一个额外的"超级"创建方法,就像这样,并把它也放在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();

谢谢

您可以在构造函数的任何位置分配this引用。然而,这可能并不明智,这取决于你的情况。主要问题是,虽然对象在构造函数时存在,但它没有完全构造,因此可能无法正确处理方法调用。例如,如果指定的引用在构造函数(和任何子类构造函数)完成之前被一个不知情的线程使用(或由构造函数调用的方法),则可能会发生不好的事情。

编辑补充:你的问题,据我所知,是要确保对对象的引用存储在特定的地方之前,谁请求对象的创建接收到新创建的对象。一种常见的模式基本上是按照您在问题中猜测的那样做,即使用工厂方法(静态方法)使用new构造对象,然后将其存储在适当的位置。这确保了只存储对完全构造的对象的引用。同时,将实际构造函数声明为privateprotected,以防止在工厂方法之外意外使用new

最新更新