我一直在使用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)
方法的情况下知道这样做的方法吗?
答案 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
}
}
您可以访问该字段并通过反射进行更改,但我不推荐这种方法。这可能只会导致问题。