-
Notifications
You must be signed in to change notification settings - Fork 27
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[아이템 21] 델리게이터 사용 예시 #255
Comments
observable과 vetoable을 먼저 보면 좋을 것 같아. class DelegatesExample {
var observable : Int by Delegates.observable(0) { _, oldValue, newValue ->
println("oldValue = $oldValue, newValue = $newValue ")
}
var vetoable : Int by Delegates.vetoable(0) { _, oldValue, newValue ->
println("oldValue = $oldValue, newValue = $newValue ")
oldValue < newValue
}
fun observableFunc() {
println("observable delegates")
println("observable = $observable")
observable = -1
println("observable = $observable")
}
fun vetoableFunc() {
println("vetoable delegates")
println("vetoable = $vetoable")
vetoable = -1
println("vetoable = $vetoable")
vetoable = 1
println("vetoable = $vetoable")
}
...
}
fun main() {
val delegates = DelegatesExample()
...
delegates.observableFunc()
delegates.vetoableFunc()
...
} 이 코드의 결과는 아래와 같아 다음으로 lazy와 Delegates.notNull을 보면 좋을 것 같아.
class Socks {
lateinit var size: Size
fun init(size: Int) {
this.size = Size(size)
}
}
class Size(val size: Int) 위 코드는 아래와 같이 컴파일 돼. public final class Socks {
public Size size;
@NotNull
public final Size getSize() {
Size var10000 = this.size;
if (var10000 == null) {
Intrinsics.throwUninitializedPropertyAccessException("size");
}
return var10000;
}
public final void setSize(@NotNull Size var1) {
Intrinsics.checkNotNullParameter(var1, "<set-?>");
this.size = var1;
}
public final void init(int size) {
this.size = new Size(size);
}
} 코드를 보면 생성할 때 Size 클래스는 null로 초기화 되어있고, getSize를 할 때 null 체크를 하는걸 알 수 있어. null로 초기화해야하기 때문에 primitive 타입은 사용할 수 없고, 값을 가져올 때마다 null 체크 후 exception을 던지기 때문에 nullable 타입에는 사용할 수 없는거지 다음으로 lateinit과 비교했을때 lazy의 특징은 아래와 같아.
아래와 같은 코드가 있을 때 자바로 컴파일 해보면 class LazyValue {
val size: Int by lazy {
println("hi! lazy")
1000
}
} public final class LazyValue {
@NotNull
private final Lazy size$delegate;
public final int getSize() {
Lazy var1 = this.size$delegate;
Object var3 = null;
return ((Number)var1.getValue()).intValue();
}
public LazyValue() {
this.size$delegate = LazyKt.lazy((Function0)null.INSTANCE);
}
} 다음으로 Delegates.notNull의 특징을 보면
아래와 같은 코드가 있을 때 자바로 컴파일 해보면 class DelegatesNotNull {
var size: Int by Delegates.notNull()
fun init() {
println(size)
}
} public final class DelegatesNotNull {
// $FF: synthetic field
static final KProperty[] $$delegatedProperties = new KProperty[]{(KProperty)Reflection.mutableProperty1(new MutablePropertyReference1Impl(DelegatesNotNull.class, "size", "getSize()I", 0))};
@NotNull
private final ReadWriteProperty size$delegate;
public final int getSize() {
return ((Number)this.size$delegate.getValue(this, $$delegatedProperties[0])).intValue();
}
public final void setSize(int var1) {
this.size$delegate.setValue(this, $$delegatedProperties[0], var1);
}
public final void init() {
int var1 = this.getSize();
System.out.println(var1);
}
public DelegatesNotNull() {
this.size$delegate = Delegates.INSTANCE.notNull();
}
} lazy와 Delegates.notNull의 경우 lateinit 과 다르게 Lazy 또는 ReadWriteProperty로 한번 wrapping하고 사용하기 때문에 primitive 타입도 사용 가능한 것을 확인할 수 있어. |
질문 :
책에서 나오는 아래 프로퍼티 델리게이터 패턴에 대한 예시와 어떻게 동작하는지 설명해주시면 좋을 거 같습니다.
The text was updated successfully, but these errors were encountered: