Zum*_*med 3 android kotlin kotlin-android-extensions
我一直在看Kotlin官方教程.我遇到了一个名为Backing Fields的主题
它说,
Kotlin中的类不能有字段.但是,有时在使用自定义访问器时需要有一个支持字段.出于这些目的,Kotlin提供了一个自动支持字段,可以使用字段标识符访问该字段:
var counter = 0 // the initializer value is written directly to the backing field
    set(value) {
        if (value >= 0) field = value
    }
Run Code Online (Sandbox Code Playgroud)
我从这个官方链接得到了上述内容
我的问题是,"字段"指向计数器变量吗?
有人可以为我提供一个支持领域的例子,还是用一个理解词来形容我?
Eug*_*nec 12
考虑这个课程
class SomeClass {
    var counter: Int = 0
        set(value) {
            if (value >= 0) field = value
        }
}
Run Code Online (Sandbox Code Playgroud)
在Android Studio中,转到Main menu -> Tools -> Kotlin -> Show Kotlin Bytecode并单击DecompileKotlin字节码面板.
你看到的是Java中的等效代码.
public final class SomeClass {
   private int counter;
   public final int getCounter() {
      return this.counter;
   }
   public final void setCounter(int value) {
      if(value >= 0) {
         this.counter = value;
      }
   }
}
Run Code Online (Sandbox Code Playgroud)
        该field关键字允许你指定一个定制的setter内的值。在科特林counter = 3将致电set(3)。因此,如果您定义
var counter=0
set(value){
    counter = value
}
Run Code Online (Sandbox Code Playgroud)
它会递归调用自己,直到堆栈已满并且进程崩溃为止。该field关键字的值的情况下直接再次调用二传手分配。
支持字段只是一个字段,只有当它使用至少一个访问器的默认实现时才会为类中的属性生成
仅当属性使用 getter/setter 的默认实现时才会生成支持字段。如果您以 Java. 它看起来是正确的。但是在“kotlin”中它会抛出异常。
  class User{ 
       var firstName : String //backing field generated
      get() = firstName 
      set(value) {
           firstName = value
      } 
      var lastName : String //backing field generated 
      get() = lastName 
      set(value) {
           lastName = value
      }
      val name : String //no backing field generated 
      get() = "{$firstName $lastName}" 
      var address : String = "XYZ" //^because there is no default //^implementation of an accessor 
 }
Run Code Online (Sandbox Code Playgroud)
在 Kotlin 中,上面的代码片段将抛出 StackOverflow,因为当我们访问或设置属性“first-name”或“last name”时,将调用默认访问器。所以在 Kotlin 中,"user.firstName = "value"" 与 Java 的 "user.setFirstName("value")" 相同。
所以当"set(value) {firstName = "value"} " 被调用时,递归调用发生并且编译器抛出异常异常,因为我们在setter 中调用setter。
这个问题的解决方案是用户支持字段。在 Kotlin 中,可以使用访问器中的“field”关键字访问支持字段。看看下面更正的代码片段。
 class User{ 
      var firstName : String get() = field 
      set(value) {
           field = value
      } 
      var lastName : String get() = field 
      set(value) {
           field = value} 
      }
 }
Run Code Online (Sandbox Code Playgroud)
        |   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           2106 次  |  
        
|   最近记录:  |