我是kotlin的新手,并且无法理解getter和setter在kotlin中的行为,所以如果我将setter设置为private。那么更新值的方法是什么。
package foo
class Person() {
var name: String = "defaultValue"
private set
}
答案 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"