ProgramingTip

Kotlin 지원 필드는 무엇입니까?

bestdevel 2020. 11. 5. 08:25
반응형

Kotlin 지원 필드는 무엇입니까?


Java 개발자로서 지원 필드의 개념은 나에게 약간의 이질적입니다. 주어진 :

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

이 지원 필드는 무엇에 유용합니까? Kotlin 문서에 따르면 Kotlin의 클래스는 필드를 사용하지 않습니다. 그러나 라이선스 사용자 지정 접근이 사용할 때 지원 필드가 필요합니다 . 왜? setter 내부에서 속성 이름 자체를 사용하는 것과 다른 점은 무엇입니까?

    class Sample {        
        var counter = 0
        set(value) {
            if (value >= 0) this.counter = value // or just counter = value?
        }
    }

예를 들어 field키워드가 키워드 get()또는 에서 값을 실제로 설정 / 수 없습니다 set(value). 사용자 지정 접근 자의 지원 필드에 액세스 할 수 있습니다.

다음은 샘플과 동등한 Java 코드입니다.

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

setter는 그 자체로 무한한 재귀이며 아무것도 변경하지 않기 때문에 좋지 않습니다. kotlin에서 쓸 때마다 . foo.bar = value대신 setter 호출로 변환 PUTFIELD됩니다.


편집 : Java에는 필드가 있습니다 Kotlin에는 필드보다 높은 수준의 개념 인 속성 이 있습니다.

속성에는 두 가지 유형이 있습니다. 하나는 지원 필드가 다른 하나는없는 속성입니다.

지원 필드가있는 속성은 값을 필드 형식으로 저장합니다. 이 필드는 메모리에 값을 지정합니다. 다만 속성의 예는의 firstsecond속성입니다 Pair. 이 속성은의 메모리 내 표현을 변경합니다 Pair.

지원 필드가없는 속성은 메모리에 직접 저장하는 것보다 다른 방법으로 값을 저장해야합니다. 다른 속성 또는 객체 자체에서 계산해야합니다. 속성의 예 이러한로는의 indices확장 속성이 있습니다. 속성은이 List필드에서 지원되지 않지만 size속성을 -based으로 계산 된 결과입니다 . 따라서 List(Java가 정적으로 형식화되어 있기 때문에 전혀 할 수없는) 의 메모리 내 표현을 변경하지 않습니다.


처음에는 저도이 개념을 이해하는 데 쓰는 데 쓰는 곳입니다. 예를 들어 설명하겠습니다.

이 Kotlin 클래스 고려

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

이제 코드를 살펴보면 size(기본 접근 자 포함) 및 isEmpty(사용자 지정 접근 자 포함) 두 가지 속성이 있음을 알 수 있습니다 . 그러나 그것은 단지 하나의 필드를 가지고 size있습니다. 필드가 1 개뿐이라는 것을 이해하기 위해 위해이 클래스에 해당하는 Java를 보겠습니다.

Tools-> Kotlin-> Android Studio에서 Kotlin ByteCode 표시로 이동합니다. 디를 클릭하십시오.

   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;
   }
}

분명히 우리는 자바 클래스에 대한 getter 및 setter 함수 만 있고 isEmpty이에 대해 선언 된 필드가 알 수 있습니다. 많은 Kotlin에는 속성 isEmpty대한 지원 필드가 없습니다 . 속성이 해당 필드에 전혀 의존하지 않습니다. 따라서 지원 필드가 없습니다.


이제 사용자 정의 getter 및 setter isEmpty속성을 제거하겠습니다 .

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

그리고 위의 클래스에 해당하는 Java는 다음과 같습니다.

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;
   }
}

여기에서 필드 sizeisEmpty. 속성에 isEmpty대한 getter 및 setter가 isEmpty종속 필드이므로 지원 필드 입니다.


지원 필드는 유효성 검사를 실행하거나 상태 변경시 이벤트를 트리거하는 데 유용합니다. Java setter / getter에 코드를 추가 한 시간을 생각해보십시오. 지원 필드는 유사한 시나리오에서 유용합니다. setter / getter를 제어하거나 가시성을 확보해야 할 때 지원 필드를 사용합니다.

필드 이름 자체로 필드를 할당 할 때 실제로 setter (예 :)를 호출합니다 set(value). 당신이 가지고있는 예제에서, this.counter = value스택이 오버플로 될 때까지 set (value)로 재귀 할 것입니다. 사용 field하면 setter (또는 getter) 코드를 우회합니다.


나의 이해는 사용하는 필드 의 속성 값에 대한 참조로 식별자를 GET 또는 설정 변경하거나에서 속성의 값을 사용하려는 경우, GET 또는 세트 .

예를 들면 :

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)

참고 URL : https://stackoverflow.com/questions/43220140/whats-kotlin-backing-field-for

반응형