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에는 필드보다 높은 수준의 개념 인 속성 이 있습니다.
속성에는 두 가지 유형이 있습니다. 하나는 지원 필드가 다른 하나는없는 속성입니다.
지원 필드가있는 속성은 값을 필드 형식으로 저장합니다. 이 필드는 메모리에 값을 지정합니다. 다만 속성의 예는의 first
및 second
속성입니다 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;
}
}
여기에서 필드 size
와 isEmpty
. 속성에 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
'ProgramingTip' 카테고리의 다른 글
NodeJS-setTimeout (fn, 0) 대 setImmediate (fn) (0) | 2020.11.05 |
---|---|
컴파일러가 "char"를 "int"와 일치하지만 "short"가 아닌 이유는 무엇입니까? (0) | 2020.11.05 |
POJO (Plain Old Java Object)라는 용어는 정확히 무엇을 의미합니까? (0) | 2020.11.05 |
메시지와 포스트 메시지의 차이점은 무엇이며 C #, WPF 및 Pure Windows 프로그래밍과 어떤 관련이입니까? (0) | 2020.11.05 |
Firefox 4 onBeforeUnload 사용자 지정 메시지 (0) | 2020.11.05 |