Kotlin 안전한 캐스팅

4695 단어 fragmentandroidkotlin


여러 경우에 전역 변수를 캐스팅하고 인스턴스를 미리 확인해야 하는 상황에 직면했을 수 있습니다.

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()
}

좋은 웹페이지 즐겨찾기