무엇's 틀린 백업 분야?

로 Java developer,개념의 백업 분야가 조금 외국인이다. 정:

   class Sample {
        var counter = 0 // the initializer value is written directly to the backing field
        set(value) {
            if (value >= 0) field = value
        }
    }

무엇's 이 백업 분야에 대한 좋은? [코 틀린 문서](https://kotlinlang.org/docs/reference/properties.html 드)클래스에서 코 틀린할 수 없습니다. 그러나 때때로 그것이 필요하다는 백 필드를 사용할 때는 주문 접근. 왜? 무슨 차이와 속성을 사용하여 이름 자체 내부에 setter,예를 들어,.

    class Sample {        
        var counter = 0
        set(value) {
            if (value >= 0) this.counter = value // or just counter = value?
        }
    }
질문에 대한 의견 (3)
해결책

기 때문에 말하지 않는 경우't필드키워드를't 할 수 있는 실제로 설정/얻은 값을 얻을()또는세트(value). 그것은에 액세스할 수 있습 백업 분야에서 사용자 지정 줍니다.

이것은 해당하는 자바의 코드는 샘플:

class Sample {
    private int counter = 0;
    public void setCounter(int value) {
        if (value >= 0) setCounter(value);
    }
    public int getCounter() {
        return counter;
    }
}

분명히 이가 좋지 않으로,세터는 infinte 재귀,그 자체로는 결코 변화는 아무것도. 기억에 틀린 때마다 당신이 쓰는foo.바=value로 번역될 것입 setter 화 대신PUTFIELD.


편집:자바동안 코 틀린이특성는 오히려 더 높은 수준의 개념을 보다는 필드가 있습니다.

의 두 가지 유형이 있 속성:중 하나로 백업 분야 중 하나이다.

속성으로 백업 필드 값을 저장 형태다. 된 필드를 저장하는 값에서 메모리가 가능합니다. 예를 들어 같은 속성에먼저두 번째의 속성은페어링. 는 숙박 시설은 변화에는 메모리를 표현의페어링.

속성 없이 백업 분야 할 것이 스토어에서 자신의 가치 보다 다른 방법으로 바로 저장하는 메모리에 있습니다. 그것을 계산해야 하는 다른 속성에서,또는,개체. 예를 들어,이러한 특성은지표확장자의 재산목록에는 지원되지 않는 분야,하지만 계산 결과에 따라의 크기는을 제공합니다. 그래서 그't 변화 메모리의 표현을목록`(수있는't 할 때문에 모든 Java 정적으로 입력).

해설 (2)

처음에는 나는 너무 힘든 시간을 이해하고 이 개념이다. 그래서 나는 그것을 설명하여 당신의 도움으로 예입니다.

이 코 틀린스 클래스

class DummyClass {
    var size = 0;
    var isEmpty
        get() = size == 0
        set(value) {
            size = size * 2
        }
}

지금 우리가 볼 때에 코드,우리가 볼 수있는 그것은 2 다.e-크기(기본 접근자)와isEmpty(사용자 정의 접근). 그러나 그것만 1 분야,즉크기. 을 이해하는 것 그것만 1 분야,우리가 볼 Java 에 해당의 이 클래스입니다.

가구>코 틀린->쇼 코 틀린 바이트코드 안드로이드 스튜디오에. 클릭 디컴파일.

   public final class DummyClass {
   private int size;

   public final int getSize() {
      return this.size;
   }

   public final void setSize(int var1) {
      this.size = var1;
   }

   public final boolean isEmpty() {
      return this.size == 0;
   }

   public final void setEmpty(boolean value) {
      this.size *= 2;
   }
}

분명히 우리는 것을 볼 수 있습 java 클래스가 만 getter 및 세터 기능을 위해isEmpty,그리고 없는 필드를 선언했습니다. 마찬가지로 코 틀린이 없 백업 분야에 대한 속성isEmpty기 때문을 제공하지 않't 에 따라 달라는 분야에서 모두. 따라서 백업 분야이다.


이제 우리가 사용 getter 및 세터의isEmpty을 제공합니다.

class DummyClass {
    var size = 0;
    var isEmpty = false
}

와 자바의 동등한 위의 클래스

public final class DummyClass {
   private int size;
   private boolean isEmpty;

   public final int getSize() {
      return this.size;
   }

   public final void setSize(int var1) {
      this.size = var1;
   }

   public final boolean isEmpty() {
      return this.isEmpty;
   }

   public final void setEmpty(boolean var1) {
      this.isEmpty = var1;
   }
}

여기서 우리는 모두 필드크기isEmpty.isEmpty은 백업 분야기 때문에 getter 및 세터한isEmpty속성에 따라 달라집니다.

해설 (1)

백업 분야 좋은 실행하기 위한 유효성 검사 또는 이벤트 트리거링에서의 상태 변경. 생각의 시대를've 추가 코드를 Java 세터/getter. 백업 분야에서 유용할 것 이와 유사한 시나리오. 당신이 사용하는 것을 백업할 때 필드하는 데 필요한 통제 또는 가시성을 통해 세터/getters.

을 할당할 때 필드 필드에 이름을 자체,당신이'실제로 다시 호출하면 컴파일이(즉,세트(가치)). 예제에서 당신은,이다.카운터 값=would recurse 로 설정(값)까지 우리는 오버플로우의 스택이다. 를 사용하여``필드시 setter(또는 getter)코드입니다.

해설 (0)

이해 내용*현장한 식별자에 대한 참조로 호텔's 값이다.********설정,을 변경하고자 할 때 사용하거나 호텔's 값이다.********설정**.

예를 들어:

class A{
    var a:Int=1
        get(){return field * 2}    // Similiar to Java: public int geta(){return this.a * 2}
        set(value) {field = value + 1}
}

다음:

var t = A()
println(t.a)    // OUTPUT: 2, equal to Java code: println(t.a * 2)
t.a = 2         // The real action is similar to Java code: t.a = t.a +1
println(t.a)    // OUTPUT: 6, equal to Java code: println(t.a * 2)
해설 (0)