Closeable 인터페이스를 구한혀는 리소스는 레퍼런스가 없어질 때 가비지 컬렉터가 처리한다.
- 자동 처리는 느리며 쉽게 처리되지 않아 close를 명시적으로 호출해주는 것이 좋다
java의 try with resource 같은 키워드가 없으므로 try finally로 처리가능하다
- try finally로 처리할 시 try 예외 발생 후 finally 구문에서 예외가 발생하면 둘 중 하나의 예외만 전파된다
- close 예외가 발생할 경우를 대비해 예외처리를 해주어야 한다.
kotlin은 위 불편을 해소하기 위해 use 함수를 제공한다
코틀린의 확장함수로 제공
Closeable에 사용할 수 있다.
@InlineOnly @RequireKotlin("1.2", versionKind = RequireKotlinVersionKind.COMPILER_VERSION, message = "Requires newer compiler version to be inlined correctly.") public inline fun <T : Closeable?, R> T.use(block: (T) -> R): R { contract { callsInPlace(block, InvocationKind.EXACTLY_ONCE) } var exception: Throwable? = null try { return block(this) } catch (e: Throwable) { exception = e throw e } finally { when { apiVersionIsAtLeast(1, 1, 0) -> this.closeFinally(exception) this == null -> {} exception == null -> close() else -> try { close() } catch (closeException: Throwable) { // cause.addSuppressed(closeException) // ignored here } } } }
파일을 한줄씩 처리할 때 활용할 수 있는 useLines도 제공한다
- 메모리에 한줄씩만 유지된다
public inline fun <T> Reader.useLines(block: (Sequence<String>) -> T): T = buffered().use { block(it.lineSequence()) }
'Reading Record > 이펙티브 코틀린' 카테고리의 다른 글
[이펙티브 코틀린] Item11. 가독성을 목표로 설계하라 (0) | 2022.04.19 |
---|---|
[이펙티브 코틀린] Item10. 단위 테스트를 만들어라 (0) | 2022.04.19 |
[이펙티브 코틀린] Item8. 적절하게 null을 처리하라 (0) | 2022.04.19 |
[이펙티브 코틀린] Item7. 결과 부족이 발생할 경우 null과 failure를 사용하라 (0) | 2022.04.19 |
[이펙티브 코틀린] Item6. 사용자 정의 오류보다는 표준 오류를 사용하라 (0) | 2022.04.06 |