일반적으로 자바에서 액션이나 연산을 전달할때, SAM을 활용했다.
SAM이란, 메서드가 하나만 있는 인터페이스를 의미한다.
interface OnClick{
fun clicked(view: View)
}
함수 타입을 사용하는 코드로 변경하면, 더 많은 자유를 얻는다.
fun setOnClickListener(listener : (View) -> Unit){
}
setonCLickListener {}
setonCLickListener {fun(view){}}
setonCLickListener (::println)
setonCLickListener (this::showUsers)
class ClickListener : (View) -> Unit{
override fun invoke(view: View){
}
}
또한 type alias
를 사용하면 파라미터도 이름을 가질수 있다.
typealias OnClick = (view: View) -> Unit
fun setOnClickListener(listener : OnClick) {}
여러 옵저버를 사용할때 고전적인 자바는 인터페이스를 기반으로 구현했다.
class CalenderView{
var listner : Listener ? = null
interface Listener{
fun onDateClicked(date : Date)
fun onPageChanged(data : Date)
}
}
API를 소비하는 사용자의 관전에선 함수 타입을 따로따로 갖는것이 훨씬 사용하기 쉽다.
class CalenderView{
var onDateClicked : ((date: Date) -> Unit) ? = null
var onPageChanged : ((date: Date) -> Unit) ? = null
}
코틀린이 아닌 다른 언어에서 사용할 클래스를 설계할때이다.
이외의 경우에는 SAM보단 함수타입을 사용하라