호출을 연쇄시키는 중간에 null이 결과로 나올 수 있는데, 최종 결과에만 관심이 있는 경우 안전한 호출을 사용하면 여러 호출을 간결하게 연쇄시킬 수 있다.
SafeCallsAndElvis/ChainedCalls.kt
package safecalls
import atomictest.eq
class Person(
val name: String,
var friend: Person? = null
)
fun main() {
val alice = Person("Alice")
alice.friend?.friend?.name eq null // [1]
val bob = Person("Bob")
val charlie = Person("Charlie", bob)
bob.friend = charlie
bob.friend?.friend?.name eq "Bob" // [2]
(alice.friend?.friend?.name
?: "Unknown") eq "Unknown" // [3]
}
안전한 호출을 사용해 여러 멤버에 대한 접근을 연쇄시키는 경우 중간에 어느 하나라도 null을 내놓으면 전체 결과가 null이 된다.
• [1] alice.friend 프로퍼티가 null이므로 나머지 호출도 null을 돌려준다.
• [2] 모든 중간 단계 호출이 의미 있는 값을 내놓는다.
• [3] 안전한 호출을 연쇄시킨 뒤에 엘비스 연산자를 붙여서 연쇄 중간에 null이 반환된 경우에 대한 대안값을 지정한다.