Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 不调用Set方法的字段的Set值-Kotlin_Android_Kotlin_Getter Setter - Fatal编程技术网

Android 不调用Set方法的字段的Set值-Kotlin

Android 不调用Set方法的字段的Set值-Kotlin,android,kotlin,getter-setter,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 ret

我一直在使用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())}

                    )
}
var项目列表:列表?=无效的
设置(值){
保存项目(值为ArrayList)
字段=值
}
//转到数据库并检索项目列表
有趣的加载项目(回调:Project.OnProjectsLoadedListener){
database.projectDao().getAll().subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())
.订阅(
{成功->
callback.onProjectsLoaded(成功)
//这里我不想保存项目,因为我已经从数据库中加载了它们
this.projectList=成功
},
{error->GenericErrorHandler.handleError(错误,callback.retrieveContext())}
)
}

是否有人知道不调用
set(value)
方法就可以执行此操作?

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

不过,围绕您的需求可能还有其他一些方法。这里有两个例子。您不必完全遵循它们,但也可以将它们组合起来,以生成您想要的任何解决方案

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

class Example1 {
  var fieldProperty: Int = 0

  var setterPropertyForField: Int
    get() = fieldProperty
    set(value) { 
      fieldProperty = value 
    }
}
您可以使用setter,就像在Java中使用JVM字段和set方法一样。
@JvmField
可能不是必需的。

class Example2 {
  @JvmField var fieldProperty: Int = 0

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

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

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

不过,围绕您的需求可能还有其他一些方法。这里有两个例子。您不必完全遵循它们,但也可以将它们组合起来,以生成您想要的任何解决方案

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

class Example1 {
  var fieldProperty: Int = 0

  var setterPropertyForField: Int
    get() = fieldProperty
    set(value) { 
      fieldProperty = value 
    }
}
您可以使用setter,就像在Java中使用JVM字段和set方法一样。
@JvmField
可能不是必需的。

class Example2 {
  @JvmField var fieldProperty: Int = 0

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

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

使用构造函数?@Zoe不确定这在这里如何适用。需要解释吗?如果您想在不使用set方法或不直接调用变量的情况下设置一个值(与使用getter和setter大致相同),那么唯一的选项就是在创建对象时对其进行doign。因此,对先前构造的对象调用constructorBut loadProject()方法。这些代码都在同一个类中。我只想在不调用setter的情况下为字段设置值。在java中,它将是
this.projectList=X
,而对于setter,它将是
setProjectList(X)
,但是在这里,我不知道如何在不触发
set(value)
方法的情况下调用该字段。如果所有代码都在Kotlin中,那么也只需使用
this.projectList=X
。如果从Java调用Kotlin,则必须使用getter和setter,但从Kotlin的内部,编译器会自动调用getter和setter。除非这是您试图避免的,否则我建议您重命名自定义getter和setter,这样在使用构造函数进行设置时不会发生任何特殊情况?@Zoe不确定这在这里如何适用。需要解释吗?如果您想在不使用set方法或不直接调用变量的情况下设置一个值(与使用getter和setter大致相同),那么唯一的选项就是在创建对象时对其进行doign。因此,对先前构造的对象调用constructorBut loadProject()方法。这些代码都在同一个类中。我只想在不调用setter的情况下为字段设置值。在java中,它将是
this.projectList=X
,而对于setter,它将是
setProjectList(X)
,但是在这里,我不知道如何在不触发
set(value)
方法的情况下调用该字段。如果所有代码都在Kotlin中,那么也只需使用
this.projectList=X
。如果从Java调用Kotlin,则必须使用getter和setter,但从Kotlin的内部,编译器会自动调用getter和setter。除非这是您试图避免的,在这种情况下,我建议您重命名自定义getter和setter,以便在设置时不会发生任何特殊情况如果JVMField注释工作正常,那么它将允许您访问字段本身,而不是setter方法。我一直在寻找这样的答案,但是没有办法,所以谢谢你给我举了一些例子,告诉我应该怎么做!:)如果JVMField注释能够工作,使您能够访问字段本身而不是setter方法,那就太酷了。我一直在寻找这样的答案,但是没有办法,所以谢谢你给我举了一些例子,告诉我应该怎么做!:)