重新实现Application单例化

在这个情景下,委托就可以帮助我们了。我们直到我们的单例不会是null,但是我们不能使用构造函数去初始化属性。所以我们可以使用notNull委托:

  1. class App : Application() {
  2. companion object {
  3. var instance: App by Delegates.notNull()
  4. }
  5. override fun onCreate() {
  6. super.onCreate()
  7. instance = this
  8. }
  9. }

这种情况下有个问题,我们可以在app的任何地方去修改这个值,因为如果我们使用Delegates.notNull(),属性必须是var的。但是我们可以使用刚刚创建的委托,这样可以多一点保护。我们只能修改这个值一次:

  1. companion object {
  2. var instance: App by DelegatesExt.notNullSingleValue()
  3. }

尽管,在这个例子中,使用单例可能是最简单的方法,但是我想用代码的形式展示给你怎么去创建一个自定义的委托。