属性与Java中的字段是相同的,但是更加强大。属性做的事情是字段加上getter加上setter。我们通过一个例子来比较他们的不同之处。这是Java中字段安全访问和修改所需要的代码:
public class Person {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
...
Person person = new Person();
person.setName("name");
String name = person.getName();
在Kotlin中,只需要一个属性就可以了:
public class Person {
var name: String = ""
}
...
val person = Person()
person.name = "name"
val name = person.name
如果没有任何指定,属性会默认使用getter和setter。当然它也可以修改为你自定义的代码,并且不修改存在的代码:
public classs Person {
var name: String = ""
get() = field.toUpperCase()
set(value){
field = "Name: $value"
}
}
如果需要在getter和setter中访问这个属性自身的值,它需要创建一个backing field
。可以使用field
这个预留字段来访问,它会被编译器找到正在使用的并自动创建。需要注意的是,如果我们直接调用了属性,那我们会使用setter和getter而不是直接访问这个属性。backing field
只能在属性访问器内访问。
就如在前面章节提到的,当操作Java代码的时候,Kotlin将允许使用属性的语法去访问在Java文件中定义的getter/setter方法。编译器会直接链接到它原始的getter/setter方法。所以当我们直接访问属性的时候不会有性能开销。