Java 8 Stream 인스턴스는 항상 close ()해야합니까?


12

Javadoc Quoth :

스트림에는 BaseStream.close () 메소드가 있으며 AutoCloseable을 구현하지만, 거의 모든 스트림 인스턴스를 실제로 사용한 후 닫을 필요는 없습니다. 일반적으로 소스가 IO 채널 인 스트림 (예 : Files.lines (Path, Charset)에 의해 반환 된 스트림) 만 닫아야합니다. 대부분의 스트림은 컬렉션, 배열 또는 생성 기능에 의해 지원되며 특별한 리소스 관리가 필요하지 않습니다. 스트림을 닫을 필요가 있으면 try-with-resources 문에서 자원으로 선언 될 수 있습니다.

"거의 모든"과 "일반적으로"는 모호합니다. 라이브러리를 작성하고 해당 스트림의 사용자로부터 스트림의 소스를 추상화하는 경우 항상 질문을해야합니다. 이?" 터미널 지원이 호출하지 않기 때문에 IO 기반 스트림을 닫아야합니다 close. 따라서 효과적으로 항상 스트림이 어디에서 왔는지 기억하거나 문서화해야하거나 항상 스트림을 가져와야 close합니다.

핵 옵션은 메소드에서 스트림을 반환하지 않거나 JDK 팀의 일부 사람들이 에코 한 감정 인 스트림 매개 변수를 허용하는 것입니다. Streams의 실용적인 유용성을 고려하면 지나치게 제한적이라는 것을 알았습니다.

스트림 닫기에 대한 모범 사례는 무엇입니까? 나는 비슷한 커뮤니티 질문에 대해 활발하게 활동하고 있지만 관련성이없는 JDK 사람들 중 일부의 답변을 온라인에서 찾았습니다.


Java 개발자는 아니지만 다음 규칙을 사용합니다.-스트림이 인수로 전달되면 필요한 경우 호출자가 스트림을 닫아야한다는 것을 문서화하십시오. -스트림이 함수에서 리턴되면 닫아야한다고 가정하십시오.
바트 반 Ingen Schenau

답변:


6

당신이 말했듯이, Java에서는 누가 어떤 리소스를 해제해야 할지를 정확히 알아야하므로 적절한 try-catch-constructs, try-with-resources를 넣거나 어떻게 든 해당 작업을 위임 할 수 있습니다.

정리를 위해 GC에 의존 할 수있는 유일한 것은 100 % 순수한 메모리입니다.
이 경우 에 혼합 다른 자원이 될, 당신이 합리적으로 할 수있는 유일한 것은 단순히 안전한 재생됩니다.


기본적으로 close유일한 안전한 대안입니까? 문제는 Stream이 사용하기 편리 할 때마다 코드를 지나치게 못 생기게 만드는 방법에 관한 것입니다.
RuslanD

1
예, 메모리가 아닌 리소스 가 있을 수있는 유일한 방법은이 있다고 가정하는 것 입니다 . Java가 GC가 아닌 리소스에 매우 적합하지 않더라도 그 방법은 없습니다.
중복 제거기

따라서 두 컬렉션 사이의 스트림 (순수한 메모리)이라면 닫을 필요가 없습니까?
Amalgovinus

@Amalgovinus 수정
브래드 쿠핏

5

"모범 사례"가 진행되는 한 "리소스 스트림"을 반환하는 메서드에 명명 규칙을 사용하는 것이 좋습니다.

스트림이해야하는 경우 close()에드, 팩토리 메소드 호출 open()또는 openStream(). stream()SDK에서 설정 한 규칙에 따라 임시 스트림을 구성하는 메소드를 호출 하십시오. 항상 클라이언트에게 javadoc에 메소드를 호출해야 close()합니다.

public interface StreamingServer<RECORD> {
    /** 
     * Return a memory-efficient record stream from {@code source}.
     * Clients <em>must</em> call {@link Stream#close} to dispose the
     * stream.
     */
    Stream<RECORD> openStream(URI source) throws IOException;
}

SDK 작성자가 AutoCloseable기본 스트림 클래스를 선택하지 않기를 바랍니다 . ResourceStream사소하게 구현 하는 별개의 하위 유형 AutoCloseable은 다른 계약을 명백하게 만들었을 것입니다. 그런 다음 필요하지 않은를 닫을 수 없으며 정적 분석 도구에서 Stream잘못 관리 될 가능성을 감지 할 수 ResourceStream있습니다.

코드베이스의 요구 사항 (및 코드 검토에서 규칙을 적용 할 수있는 기능)에 따라 필요한 스트림 하위 클래스를 직접 설정할 수 있습니다. 또는 자체 정적 분석 도구를 작성하려는 경우 관리 자원을 직접 표시하는 메소드 주석입니다.

@RequiresClose
Stream<RECORD> openStream(URI source) throws IOException { ... }
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.