Kotlin中能否简化ConnectivityManager初始化的赋值表达式?
优化ConnectivityManager初始化的几种简洁方式
嗨,我来给你分享几个比if-else更优雅的写法,完全贴合Kotlin的风格~
首先得说个实用小知识点:不管你传入的是Activity、Service还是Application Context,调用context.applicationContext都会返回全局的Application Context——如果当前Context本身就是Application的话,这个方法会直接返回自身,所以其实我们甚至不需要额外判断类型,就能一步拿到安全的全局Context!
最简洁的最优方案:直接用applicationContext
这应该是最省心的写法,代码超级简洁,还能从根源避免内存泄漏:
val connectivityManager = context.applicationContext .getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
如果一定要保留“判断是否为Activity Context”的逻辑(比如有特殊业务约束),那可以用下面两种Kotlin风格的写法:
方式一:结合takeIf + Elvis运算符
用takeIf判断是否为Activity,符合条件就取它的applicationContext,否则用原Context,链式调用一气呵成:
val connectivityManager = (context.takeIf { it is Activity }?.applicationContext ?: context) .getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
方式二:用let封装判断逻辑
把类型判断放在let块里,返回合适的Context后再获取系统服务,可读性拉满:
val connectivityManager = context.let { ctx -> if (ctx is Activity) ctx.applicationContext else ctx }.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
这几种写法都比传统的if-else更紧凑,而且保持了代码的可读性,其中直接用applicationContext的方案最推荐——毕竟系统已经帮我们处理了类型判断的逻辑,不用自己重复造轮子啦~
内容的提问来源于stack exchange,提问作者Sahil Patel
相关产品推荐
相关产品推荐

