버전 7부터 Java는 작업을 마친 후 닫아야 하는 리소스에 대한 향상된 관리 기능을 제공합니다. 이러한 리소스에는 파일, 스트림, 데이터베이스 연결 및 소켓 등이 포함됩니다. 이 목적은 특수 언어 구조 try-with-resources에 의해 제공됩니다. 이 자동 닫기가 작동하기 위해 특별한 인터페이스가 생성되었습니다
AutoCloseable
. Java 7에서는 모든 리소스 클래스가 이 인터페이스를 구현합니다. 서명은 다음과 같습니다.
public interface AutoCloseable {
void close() throws Exception;
}
close()
인터페이스는 구문이 제공하는 객체에 대해 자동으로 호출되는 메서드를 선언합니다 try-with-resources
. Java 7의 리소스 클래스는 이 인터페이스를 구현하지만 사용하는 라이브러리 중 상당수는 AutoCloseable 인터페이스 와 작동하도록 라이브러리가 아직 업데이트되지 않았거나 단순히 라이브러리를 업데이트할 수 있는 기능이 없기 때문에 그렇지 않습니다. 대부분의 경우 이 문제는 쉽게 해결될 수 있습니다. 에 참여해야 하는 리소스 클래스를 상속합니다 try-with-resources
. ITextRenderer
(Flying Saucer 프로젝트의) 예를 들어보겠습니다 . 작업을 마친 후에 ITextRenderer
는 메소드를 호출해야 합니다 finishPDF()
. 일반적으로 이 작업은 블록에서 수행됩니다 finally
. ITextRenderer
그러나 인터페이스를 확장하고 구현하는 새 클래스를 생성하는 경우 AutoCloseable
해당 클래스를 try-with-resources
. 새 클래스는 AutoCloseableITextRenderer
다음과 같습니다.
public class AutoCloseableITextRenderer extends ITextRenderer implements AutoCloseable {
@Override
public void close() {
super.finishPDF();
}
}
새 클래스는 여전히 ITextRenderer
. 원본 클래스가 로 선언된 경우에는 final
컴포지션을 사용해야 합니다. 사용법은 다음과 같습니다.
try (final AutoCloseableITextRenderer iTextRenderer = new AutoCloseableITextRenderer()) {
ByteArrayOutputStream out; // contains the data to be converted to PDF, not shown here.
iTextRenderer.setDocumentFromString(new String(out.toByteArray()));
iTextRenderer.layout();
iTextRenderer.createPDF(pdfOutputStream);
pdfOutputStream.flush();
}
그게 다야. close()
의 메서드에서 예외를 발생시키지 않았습니다 AutoCloseableITextRenderer
. 인터페이스의 Javadoc에서는 AutoCloseable
이에 대해 다음과 같이 설명합니다. 인터페이스 메소드가 예외를 발생시키도록 선언되었지만 이 메소드의 구현자는 메소드를 구현할 때 보다 구체적인 예외 클래스를 사용하거나 메소드가 예외를 발생시킬 수 없는 Exception
경우 전혀 예외를 발생시키지 않는 것이 좋습니다. close()
실패하다.
GO TO FULL VERSION