본문 바로가기

Android

kotlin and SAM

일단 kotlin 을 짬짬히 해본 결과 SAM 형태의 interface 를 별도로 더 이상 만들 필요 없음을 인지 했다 
가령 자바는 아래와 같은 인터페이스로 작업했다면

interface ITest {
    void onResult(boolean res);
}

class Test {
    private ITest mListener
    void setOnTestListener(ITest l) {
        mListener = l
    }

    void test() {
        if (mListener != null) { mListener.onResult(true); }
    }
}

class main() {
    void test() {
        Test a = Test();
        a.setOnTestListener((res) -> {
        });
        a.test();
    }
}

코틀린은 아래와 같이 하면 끝난다.
class Test {
    lateinit var mListener : (Boolean) -> Unit    
    fun test() {
        mListener(true) // or
        mListener.invoke(true)
    }
}

class main() {
    fun test() {
        val a = Test()
        a.mListener = { res -> }
        a.test()
    }
}

만약 인자로 리스너를 받아야 된다면 아래처럼 한다.

fun test(listener: (Boolean) -> Unit) {
    // 최신 kotlin 에서는 invoke 가 추가되었다. 
    listener(true)

    listener.invoke(true)
}

마치 예전의 function point 같은 느낌이랄까?