android - 在不调用 set 方法的情况下设置字段的值 - Kotlin

标签 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) 方法就可以做到这一点的方法?

最佳答案

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

不过,也许还有其他一些方法可以满足您的要求。这里有2个例子。您不必完全遵循它们,而是也可以将它们组合起来以制定您想要的任何解决方案。

您可以使用另一个 shell 属性作为实际属性的 setter :

class Example1 {
  var fieldProperty: Int = 0

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

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

class Example2 {
  @JvmField var fieldProperty: Int = 0

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

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

关于android - 在不调用 set 方法的情况下设置字段的值 - Kotlin,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47353590/

相关文章:

Android SDK - 使用手势API,希望手势在被识别后留在屏幕上

android - 可组合 fillMaxSize 和旋转不起作用

kotlin - 如何在 Kotlin 中的一行中将一个值与多个其他值进行比较

c++ - 为哈希表获取和设置正确重载 [bracket] 运算符

python - 正确使用字典值的 getter/setter

android - "Create project from existing source"是否修改现有样本?

java - 格式化 Java 字符串

generics - Kotlin 中的通用约束,这仅仅是一个方差问题吗?

Java_通过 getter 填充数组

android - 以比在 Android 中使用 java.util.zip 更快的方式解压缩文件