Using

코틀린에서 기본적으로 Use을 제공한다.

myStream.use { // 자동으로 열고 닫는다.
val line = readLine()
}

하지만 Rx에도 자원관리를 할 수 있는 방법이 있다. 바로 Using 이다.

공식문서는 

http://reactivex.io/documentation/operators/using.html


그럼 우선 RxKotlin 에서 어떻게 보이는 지 살펴보자.

fun <T, D> using(
resourceSupplier: Callable<out D>, //첫번째 인자 (열고)
sourceSupplier: Function<in D, //두번째 인자 (값 만들고)
out ObservableSource<out T>>, //세번째 인자 (닫기)
disposer: Consumer<in D>): Observable<T> {
return using(resourceSupplier, sourceSupplier, disposer, true)
}

분해해보면 단순하다. 열어서 처리하고 닫으면 된다.

그럼 한번 사용을 해보자.

우선 닫을수 있는 Resource 클래스를 정의하자

class Resource : Closeable {
init {
println("Resource Created")
}

fun open() : Resource{
println("Resource Opened")
return this
}
val data : String = "Hello World"

override fun close() {
println("Resource closed")
}
}

이 걸 테스트 해보자.

@Test
fun testResource() {
Observable.using(
{
Resource().open() //열고
} ,
{ resource : Resource ->
Observable.just(resource) //실행
},
{ resource: Resource ->
resource.close() //닫고
}
).subscribe{
println("Resource Result -> ${it.data}")
}
}
===========
Resource Created
Resource Opened
Resource Result -> Hello World
Resource closed

잘 실행되는 걸 볼 수 있다. 의외로 간단한 사용에 놀랍다.

리소스 관리가 필요한 DB 또는 스트림에서 유용해보인다.

+ Recent posts