2014-12-03 2 views
1

Java7에서 클래스를 구현했습니다. 상속/구현하지 않습니다. 그것은 Tess4J를 사용하므로 결국 리소스를 해제하는 것이 좋을 것이라고 생각했습니다.왜 Netbeans가 최종 결정을 경고합니까?

finalize declared() 

넷빈즈 웹 사이트에 대한 설명은 나에게 더 도움이되지 않습니다 :

@Override 
protected void finalize() throws Throwable 
{ 
    try 
    { 
     TessAPI1.TessBaseAPIDelete(handle); 
    } 
    catch(Throwable t) 
    { 
     throw t; 
    } 
    finally 
    { 
     super.finalize(); 
    } 
} 

넷빈즈 8.0.2이 날이 방법에 대한 경고를 제공합니다 : 그래서 이런 식으로 마무리() 메소드를 오버라이드

warns about implementation of Object.finalize() 

나는 equals 나 다른 어떤 방법 (다른 부분에서해야할까요?)을 무시하지 않았습니다. 경고를받는 이유를 말해 줄 수 있습니까?

+1

관련 읽기 : http://weblog.ikvm.net/2003/11/09/FinalizeConsideredHarmful.aspx –

+0

Effective Java에서 인용 : "Finalizers는 예측할 수 없으며, 종종 위험하며 일반적으로 불필요합니다 *." – assylias

+2

예외를 잡아 즉시 재발행하는 것은 의미가 없습니다. 이러한 catch 블록은 실제 효과가 없으므로 제거 할 수 있습니다. – Natix

답변

4

finalize 메서드는 임의의 스레드에 의해 임의의 시간에 호출 될 수도 있고 전혀 호출되지 않을 수도있는 문제가 있습니다. discussed in this question처럼 놀랍게도 일찍 인스턴스 메서드가 실행될 때 호출 될 수 있으므로 리소스를 해제하기 위해 인스턴스 메서드를 사용하면 상당히 위험합니다.

그래서 원래 용도로는별로 유용하지 않은 경우 항상 사용하는 것이 좋다고 합법적입니다.


당신이 클라이언트 코드는 당신이 (당신이 기본 자원이 연결되어 있어야 경우) 명시 적 자원 관리를 위해 제공하는 어떤 close 또는 dispose 또는 전화를 잊어 버린 경우, 자원을 청소하기위한 코드를 구현하려면 할 수 있습니다 인스턴스에 PhantomReferenceReferenceQueue을 사용하여 수행됩니다.

이점은 대기열을 폴링하여 정리를 수행하는 시점을 제어 할 수 있으며 PhantomReference이 범위를 벗어나도록함으로써 사후 부제를 제외 할 수도 있습니다 (보통 수집되고 대기열에 포함되지 않음).) 클라이언트 코드가 이 아닌 경우close에 전화하는 것을 잊어 버렸습니다 (try with resources”을 사용하려면 AutoClosable을 구현하는 것이 좋습니다). 따라서 이는 또한 finalize 메서드를 실행하는 객체가 다시 도달 할 수 있음을 의미하므로 중요하지 않은 finalize 메서드가있는 객체를 두 번 수집해야하는 작은 성능 문제를 해결합니다.

0

finalize()는 jvm이 gc로 갈 때 호출됩니다. 어쩌면 리소스가 원하는대로 배포되지 않을 수도 있습니다.

대신 try try finally.

+0

개체 수명 동안 처리가 여러 번 호출되며 여러 가지 유형이 있습니다. 각 처리 메소드 코드를 try-finally로 둘러 쌀 수 있습니까 (우수 사례일까요?). – nuoritoveri

2

일반적으로 대부분의 Java 프로그래머는 finalize()을 구현할 이유가 없습니다. 왜냐하면 자신의 코드는 이미 관리 된 클래스 만 사용하므로 자체 finalizer가 있기 때문입니다. (질문 아래의 주석을보십시오).

일부 개발자는 가비지 수집기가 실제로 작동하는 방식을 모를 수도 있으므로 finalize()에 의존하여 다른 곳에서 수행해야하는 정리 작업을 수행해야합니다. 이 실수는 특히 테스트에서 눈에 띄지 않는 종류의 결함을 유발할 수 있지만 생산에 실패를 유발합니다.

그 이유로, finalize()에 대한 경고가 적절하다고 생각합니다.

관련 문제