Kotlin 안전한 캐스팅
여러 경우에 전역 변수를 캐스팅하고 인스턴스를 미리 확인해야 하는 상황에 직면했을 수 있습니다.
Android 환경에서 가장 일반적인 경우는 (호스팅) 활동이 콜백을 구현하는지 아니면 특정 활동에서 확장되는지 확인하는 것입니다.
전에
if (activity is BaseActivity) {
(activity as BaseActivity).hideKeyboard()
}
후에
한 줄에 달콤한 Kotlin 구문으로 작성할 수 있습니다.
(activity as? BaseActivity)?.hideKeyboard()
공식 문서에서
Use the safe cast operator as? that returns null on failure.
이것이 어떻게 더 낫습니까?
표면적으로는 더 나은 코드 개편처럼 보이지 않을 수 있습니다. 활동에 대한 호출 수가 증가할수록 더 좋아집니다.
// CreateTweetFragment.kt
fun submit() {
// Fire and forget API call
if (activity is BaseActivity) {
(activity as BaseActivity).hideKeyboard()
}
if (activity is TweetSubmittedCallback) {
(activity as TweetSubmittedCallback).onTweetSubmitted()
}
}
활동을 정확한 하위 클래스로 쉽게 캐스팅하고 두 메서드를 모두 호출할 수 있습니다.
// CreateTweetFragment.kt
fun submit() {
// Fire and forget API call
if (activity is TwitterActivity) {
(activity as TwitterActivity).hideKeyboard()
(activity as TwitterActivity).onTweetSubmitted()
}
}
그러나 CreateTweetFragment가 TwitterActivity에 연결되어 두 문을 모두 실행하도록 강제합니다. BaseActivity 또는 TweetSubmittedCallback에 불과한 모든 항목은 구현이 제자리에 있더라도 명령문을 실행하지 않습니다.
Prefer composition over inheritance
이제
as?
연산자를 사용하여 두 문을 서로 독립적으로 실행할 수 있습니다.fun submit() {
// Fire and forget API call
(activity as? BaseActivity)?.hideKeyboard()
(activity as TweetSubmittedCallback)?.onTweetSubmitted()
}
Reference
이 문제에 관하여(Kotlin 안전한 캐스팅), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/mahendranv/kotlin-safe-casting-5d4j텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)