在不调用 set 方法的情况下设置字段的值 - Kotlin
Set value of a field without calling set method - Kotlin
我一直在使用 Kotlin 在 Android 中开发一些应用程序,我目前想做的是在定义 class 中设置一个字段值而不调用 setter方法。
这是我的代码 class:
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)
方法就能做到这一点的方法吗?
您只能直接从 setter 访问该字段。在 setter 中,可以通过不可见的 field
变量访问该字段。
不过,也许还有一些其他方法可以满足您的要求。这里有2个例子。您不必完全遵循它们,而是也可以将它们组合起来以制定您想要的任何解决方案。
您可以使用另一个 shell 属性 作为您实际 属性:[=14 的 setter =]
class Example1 {
var fieldProperty: Int = 0
var setterPropertyForField: Int
get() = fieldProperty
set(value) {
fieldProperty = value
}
}
您可以像在 Java 中使用 JVM 字段和 set 方法一样使用 setters。 @JvmField
可能不是必需的。
class Example2 {
@JvmField var fieldProperty: Int = 0
fun setField(value: Int) {
fieldProperty = value
}
}
您可能可以访问该字段并通过反射更改它,但我不推荐这种方法。那可能只会导致问题。
我一直在使用 Kotlin 在 Android 中开发一些应用程序,我目前想做的是在定义 class 中设置一个字段值而不调用 setter方法。
这是我的代码 class:
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)
方法就能做到这一点的方法吗?
您只能直接从 setter 访问该字段。在 setter 中,可以通过不可见的 field
变量访问该字段。
不过,也许还有一些其他方法可以满足您的要求。这里有2个例子。您不必完全遵循它们,而是也可以将它们组合起来以制定您想要的任何解决方案。
您可以使用另一个 shell 属性 作为您实际 属性:[=14 的 setter =]
class Example1 {
var fieldProperty: Int = 0
var setterPropertyForField: Int
get() = fieldProperty
set(value) {
fieldProperty = value
}
}
您可以像在 Java 中使用 JVM 字段和 set 方法一样使用 setters。 @JvmField
可能不是必需的。
class Example2 {
@JvmField var fieldProperty: Int = 0
fun setField(value: Int) {
fieldProperty = value
}
}
您可能可以访问该字段并通过反射更改它,但我不推荐这种方法。那可能只会导致问题。