이펙티브 코틀린 아이템1 에서 "값을 사용하는 시점에 따라서 다른 결과가 나올 수 있기 때문입니다" 와 함께 보여준 예제가 잘 와닫지 않아서 예제를 만들고 자바로 변환해봄
fun nameOrNullByRandom(): String? {
return listOf(null, "huni").random()
}
val nameGetter: String?
get() = nameOrNullByRandom()
val nameFinalProperty: String? = nameOrNullByRandom()
fun main() {
if(nameGetter != null){
println(nameGetter!!.length) // 캐스팅 안됌
}
if(nameFinalProperty != null){
println(nameFinalProperty.length)
}
}
public final class TestKt {
@Nullable
private static final String nameFinalProperty = nameOrNullByRandom(); // static final로 한번만 초기화
@Nullable
public static final String nameOrNullByRandom() {
Collection var0 = (Collection)CollectionsKt.listOf(new String[]{(String)null, "huni"});
return (String)CollectionsKt.random(var0, (Random)Random.Default);
}
@Nullable
public static final String getNameGetter() {
return nameOrNullByRandom();
}
@Nullable
public static final String getNameFinalProperty() {
return nameFinalProperty;
}
}
getter는 함수이고 매번 호출할때마다 null을 반환할 수 있어서 스마트캐스팅이 불가능함 하지만 final 프로퍼티는 static final 상수에 한번만 초기화 됨으로 매번 값을 읽어도 똑같아서 스마트 캐스팅 가능!
'개발 > kotlin' 카테고리의 다른 글
kotlin let 블럭안은 스마트 캐스팅이 가능한 이유 (0) | 2023.08.10 |
---|