设置字段的值而不调用set方法 - Kotlin

时间:2017-11-17 15:01:18

标签: android kotlin getter-setter

我一直在使用Kotlin在Android中开发一些应用程序,我现在要做的是在定义类中设置字段值而不调用setter方法。

以下是我班级内的代码:

var projectList: List<Project>? = null
    set(value) {
        saveProjects(value as ArrayList<Project>)
        field = value
    }

//GO to the database and retrieve list of projects
fun loadProjects(callback: Project.OnProjectsLoadedListener) {
   database.projectDao().getAll().subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())
            .subscribe(

                    { success ->
                        callback.onProjectsLoaded(success)
                    //Here i don't want to save the projects, because i've loaded them from the database
                        this.projectList = success
                    },
                    { error -> GenericErrorHandler.handleError(error,callback.retrieveContext())}

                    )
}

有人在不调用set(value)方法的情况下知道这样做的方法吗?

1 个答案:

答案 0 :(得分:3)

您只能直接从设置者访问该字段。在setter中,可以通过不可见的field变量访问该字段。

可能还有一些其他方法可以满足您的要求。这是两个例子。你不必完全遵循它们,但也可以将它们结合起来做出你想要的任何解决方案。

您可以使用其他shell属性作为实际属性的setter:

class Example1 {
  var fieldProperty: Int = 0

  var setterPropertyForField: Int
    get() = fieldProperty
    set(value) { 
      fieldProperty = value 
    }
}

您可以像使用JVM字段和set方法一样在Java中使用setter。 @JvmField可能不是必需的。

class Example2 {
  @JvmField var fieldProperty: Int = 0

  fun setField(value: Int) {
    fieldProperty = value
  }
}

您可以访问该字段并通​​过反射进行更改,但我不推荐这种方法。这可能只会导致问题。