Kotlin中哪段代码与Code A逻辑等价?
咱们结合给定的IsRegistered函数实现,来逐个解答这两个问题:
1. Code A与Code B是否等价?
结论:完全等价
在Kotlin里,if语句的条件本身就要求是布尔值。Code A直接把IsRegistered(myContext)的布尔返回值作为判断条件;Code B则多了一步——把这个布尔值和true做相等比较(==)。
但因为IsRegistered函数返回的是非空Boolean类型(最后用!!强制解包,而且从逻辑上看registeredStatus不可能为null),所以两种写法的执行结果完全一致:
- 当
IsRegistered返回true时,true == true结果为true,和Code A的判断结果相同 - 当返回
false时,false == true结果为false,也和Code A的判断结果相同
说白了,Code B就是Code A的“啰嗦版”,Kotlin里更推荐写Code A这种简洁的写法。
2. Code A与Code C是否等价?
结论:在当前的IsRegistered函数实现下,两者完全等价
先得搞清楚Kotlin里===的作用:它是引用相等判断(在JVM上,对于基本类型来说,===其实就是值相等,因为基本类型没有引用一说)。不过咱们得结合IsRegistered的返回值细节来看:
IsRegistered里,不管是从prefs.getBoolean拿到的布尔值(会自动装箱为Boolean实例),还是直接赋值的true,都是JVM中被缓存的单例——也就是Boolean.TRUE和Boolean.FALSE,不会产生新的实例。- 代码里写的字面量
true,对应的也是同一个Boolean.TRUE单例。
所以用===比较时:
- 如果
IsRegistered返回true,true === true结果为true,和Code A的判断一致 - 如果返回
false,false === true结果为false,也和Code A的判断一致
不过这里要提个小前提:如果哪天IsRegistered的实现变了,比如手动创建了新的Boolean实例(比如写Boolean(true),这种情况不会走缓存),那===和直接判断的结果可能就不一样了,但在当前给定的实现下,两者是完全等价的。
内容的提问来源于stack exchange,提问作者HelloCW
相关产品推荐
相关产品推荐

