最近在写 Kotlin 版本的 Gank 客户端(干货集中营 app)时,发现一个非常烦人的事情:有的成员属性不能在构造函数中初始化,会在稍后某的地方完成初始化,可以确定是非空,但是因为不能在构造时初始化只能定义为可能为空的类型(T?),然后在后面调用时都要加上!!
操作符。下面本文将逐步分析这种场景的解决方案,最终提供一种优雅的方式。
这里先给出最终解决方式(为了部分喜欢直奔主题的开发者):
notNull 委托属性
lateinit 修饰符
注:本文的第一种解决方法来源于《Kotlin For Android Developers》,学习 Kotlin 的朋友有兴趣可以看看。
问题场景
相信肯定有很多开发者也遇到一样的场景,因为这种情况在 Android 中很常见:在 Activity、Fragment、Service… 中经常有些属性只能在onCreate
中才能完成初始化,而且之后不会再修改可以确定为非空,如下面代码所示:
|
|
上面代码中instance
和okHttpClient
都只能在onCreate
函数中完成初始化,但是之后都是可以确定是非空,但是在后面调用只能通过instance!!
和okHttpClient!!
的方式调用,感觉非常变扭。