Using

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

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

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

그럼 우선 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 또는 스트림에서 유용해보인다.

results matching ""

    No results matching ""