如果在kotlin中设置setter private,如何分配新值?

时间:2017-06-26 08:46:53

标签: kotlin

我是kotlin的新手,并且无法理解getter和setter在kotlin中的行为,所以如果我将setter设置为private。那么更新值的方法是什么。

package foo

class Person() {
var name: String = "defaultValue"
   private set

}

2 个答案:

答案 0 :(得分:6)

如果将setter设置为private,则只能从其类中访问此setter。换句话说,即使你的setter是私有的,你也可以使用正常的赋值,但只能在类中使用。

class Person() {
    var name: String = "defaultValue"
        private set

    fun foo(bar: String) {
        name = bar // name can be set here
    }
}

fun main(args: Array<String>) {
    Person().name = "foo" // error. Name can be accessed but can not be modified here as its setter is private.
}

有关更多信息,请查看Kotlin的Visibility documentation

答案 1 :(得分:0)

上面的kotlin代码将由kotlin编译器转换为java代码,如下所示:

package foo;
public final class Person{
  private String name = "defaultValue";

  public final String getName(){ 
      return name;
  }

  private final void setName(String name){
     this.name=name;
  }
}

表示您只能更改name课程中的Person字段。另一种情况是,如果要使用name类中的 private setter修改Person属性。你可以改用java反射,例如:

val person = Person();

val field = Person::name.javaField!!.apply { isAccessible = true }
field.set(person, "bob")
println(person.name)// "bob"

val setter = Person::class.java.getDeclaredMethod("setName", String::class.java)!!
                               .apply {
                                   isAccessible = true
                               }
setter.invoke(person, "john")
println(person.name)// "john"