2011-12-12 2 views
0

간단한 질문이 있지만 어디서나 참조에서 솔루션을 찾을 수 없습니다.개체를 만들고 참조 할 수있는 시점은 언제입니까?

인스턴스가 생성 될 때마다 인스턴스가 몇 곳으로 전파 될 특정 클래스의 인스턴스를 만들 때 코드를 넣을 가장 명확한 장소가 인스턴스 자체의 생성 방법에 있습니다.

public void MYTest() { 

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

    } 

내가 생성 방법 이미 다른 변수이 바로 새로 생성 된 인스턴스의 할당을 넣을 수 또는이 같은 추가 "슈퍼"생성 방법을 작성해야 할과 : 이것은 같을 것이다 어떻게

:

x = MYTEST.superCreationMethodForMYTEST(); 

대신 다음과 같이 호출 다음

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..... 
      } 
} 

과 : MYTEST에이를 넣어

x = new MYTEST(); 

감사

답변

2

당신은 어디 생성자에서 this 참조를 할당 할 수 있습니다. 그러나 상황에 따라 현명하지 않을 수도 있습니다. 주된 문제는 생성자가 생성자의 시간에 존재하지만 완전히 구성되지 않았기 때문에 메서드 호출을 올바르게 처리 할 수없는 상태 일 수 있습니다. 할당 된 참조가 생성자 (및 모든 하위 클래스 생성자)가 완료되기 전에 예기치 않은 스레드 (예 : 생성자가 호출하는 메서드)에 의해 사용되면 나쁜 일이 발생할 수 있습니다.

덧붙여 편집 : 문제가, 내가 알기로는, 객체의 생성을 요구 한 사람이 새롭게 생성 된 객체를 받기 전에, 객체에의 참조가 특정의 장소에 포함되는 것을 확인하는 것이 문제이다. 일반적인 패턴 중 하나는 질문에서 추측 한 것을 기본적으로 수행하는 것입니다. 즉, new을 사용하여 객체를 생성 한 다음 적절한 위치에 저장하는 팩토리 메서드 (정적 메서드)가 있습니다. 이렇게하면 완전히 구성된 개체에 대한 참조 만 저장됩니다. 동시에 실제 생성자는 private 또는 protected으로 표시되어 실수로 new이 팩토리 메서드 외부에서 사용되는 것을 방지합니다.

+0

맞습니다.하지만이 인스턴스를 만들 때마다 언제든지 필요한 모든 장소에 할당되어 있는지 확인해야합니다. 메소드를 호출 할 필요가 없기 때문에 (예 : 예를 들면 cimmunication이나 그와 비슷한 것을위한 interafce 객체). 생성하는 동안 인스턴스 변수의 참조를 사용하는 것이 실제로 유효한 코드입니까? 또는 생성 방법이 완료된 후에 만 ​​REFERENCE가 유효합니까? – user387184

+0

참조가 생성자 내부에서 유효하지만 참조가 불완전하게 구성된 객체입니다. 그러나 당신의 문제에 대한 가능한 해결책이 지금 나에게 발생한다 - 나는 그것을 대답에 추가 할 것이다. – ibid

+0

그 점에 대해 감사드립니다. - 내가 생각한 것을 확인합니다 - 그런데 이것을 정의하는 참고 자료에는 어떤 것이 있습니까? – user387184

관련 문제