变量和属性 - 属性

优质
小牛编辑
138浏览
2023-12-01

属性与Java中的字段是相同的,但是更加强大。属性做的事情是字段加上getter加上setter。我们通过一个例子来比较他们的不同之处。这是Java中字段安全访问和修改所需要的代码:

  1. public class Person {
  2. private String name;
  3. public String getName() {
  4. return name;
  5. }
  6. public void setName(String name) {
  7. this.name = name;
  8. }
  9. }
  10. ...
  11. Person person = new Person();
  12. person.setName("name");
  13. String name = person.getName();

在Kotlin中,只需要一个属性就可以了:

  1. public class Person {
  2. var name: String = ""
  3. }
  4. ...
  5. val person = Person()
  6. person.name = "name"
  7. val name = person.name

如果没有任何指定,属性会默认使用getter和setter。当然它也可以修改为你自定义的代码,并且不修改存在的代码:

  1. public classs Person {
  2. var name: String = ""
  3. get() = field.toUpperCase()
  4. set(value){
  5. field = "Name: $value"
  6. }
  7. }

如果需要在getter和setter中访问这个属性自身的值,它需要创建一个backing field。可以使用field这个预留字段来访问,它会被编译器找到正在使用的并自动创建。需要注意的是,如果我们直接调用了属性,那我们会使用setter和getter而不是直接访问这个属性。backing field只能在属性访问器内访问。

就如在前面章节提到的,当操作Java代码的时候,Kotlin将允许使用属性的语法去访问在Java文件中定义的getter/setter方法。编译器会直接链接到它原始的getter/setter方法。所以当我们直接访问属性的时候不会有性能开销。