2014-09-04 5 views
0

일반적으로 사용자가 내 공장을 사용하여 만드는 개체가 있습니다. 내 사용자가 garbage collector에 던지기 전에 object.undo()를 호출하는지 확인하고 싶습니다.개체가 수집되기 전에 메서드가 호출되는지 확인하십시오.

이 클래스는 사용자가 프로덕션 서비스에 글을 쓰지 않고 대신 테스트 특정 서비스를 사용하기 위해 필요한 리소스를 설정합니다. 사용자가 재정의를 취소하려면 실행 취소를 호출해야합니다. 여기

어느 클래스 디자인을 통해 예외 또는 던지는를 통해 나는 사용자가

여기
// in setup() 
FooObject object = FooFactory.overrideProductionServicesToTestServices(); 

// do your testing in test*() 

// in tearDown() 
object.undo() 

내가 사용자에게 통지 어떻게 사용자가

// in setup() 
FooFactory.overrideProductionServicesToTestServices() 

// do their testing. Everything works. 

// Another test, everything breaks 

을하고 결국 무엇을하고 싶은 것입니다 사용자가 undo()를 호출해야한다는 것?

+0

개체가 아직 참조되어 있지 않으면 개체가 수집되지 않으므로'object.undo()'가 호출 될 때까지 참조를 유지하십시오. –

+0

사용자가 factory.makeObject()를 변수에 넣지 않고 수행하는 것으로 나타났습니다. 이로 인해 개체가 수집되고 서비스의 동작이 엉망이됩니다. –

답변

1

가 대신 잘못 오히려 쉽다는 함께 성능에 영향을 운반 파이널 라이저를 사용하는 이유는 내부에 생성 된 객체에 PhantomReference를 저장하지 다음과 같이 finalize()의 메소드를 호출하는 올바른 방법은 공장? Javadocs에서

:

팬텀 참조는 대부분의 경우, Java의 finalize기구보다 유연한 방법으로 사전 부검 정리 작업을 예약하는 데 사용됩니다.

당신은 공장이 그 참조를 위해 관련 ReferenceQueue을 추적, 그리고 객체가 대기열에 한 번, 보통 undo에 의해 수행 정리 작업을 수행 할 수 있습니다.

+0

undo() 메소드는 get()을 통해 액세스 할 수없는 참조 대상에 속하므로 PhantomReference를 대기열에 추가하기 전에 내 referent가 undo()를 호출했다는 것을 어떻게 알 수 있습니까? –

+0

True - 실행 취소()를 직접 호출 할 수 없습니다. 그러나 참조가 대기열에 들어간 것을 볼 때 실행 취소를 통해 정리되는 모든 리소스를 여전히 확보 할 수 있습니다. –

+0

답변 해 주셔서 감사합니다. 내가 자바 참조 메커니즘을 인식하지 못했습니다. –

0

사용자가 가비지 수집기에 던지기 전에 object.undo()으로 전화를 걸고 싶습니다.

당신은 finalize() 메소드를 구현 가비지 수집되기 전에 반드시 먼저 실행하기 위해 그 안에 object.undo()를 호출 할 수 있습니다. 이처럼

:

protected void finalize() 
      throws Throwable { 
    this.undo(); 
} 

finalize() 방법에 대한 자세한 내용을 읽으려면, go to this article on Oracle.

+2

또는'object.undo()'가 호출되지 않고 호출되었는지 확인하십시오. 이렇게하면 모든 것이 '실행 취소'를 올바르게 호출하는지 테스트 할 수 있습니다. 그런 다음 성능상의 이유로 최종 내용을 파손하지 않고 제거 할 수 있습니다. – immibis

0

파이널 예외

Yes it can

을 던질 수 없습니다,하지만 당신은 그것에 대해주의해야합니다.

protected void finalize() throws Throwable 
{ 
    try 
    { 
     myMethod(); 
    } 
    finally 
    { 
     super.finalize(); 
    } 
} 
+0

"finalize 메서드로 throw 된 예외로 인해이 개체의 종료가 중지되지만 그렇지 않으면 무시됩니다." 나는 finalize 메소드에서 예외를 던지더라도 코드 사용법이 잘못되었다는 것을 사용자에게 알려주지 않는다는 사실을 언급하고자했다. –

+0

그러면 질문을 명확하게해야합니다. 그렇지 않습니까? 현재 그것은 거짓을 말하고 귀하의 요구 사항을 정확하게 진술하지는 않습니다. – EJP