반응형
코틀린 Contracts 기능은 코틀린 1.3에서 소개된 기능입니다.
컴파일러를 돕는 역할로 실험적인 기능입니다.
Initailizing in Lambdas
fun calledOneTimeOnly(run: () -> Unit) {
// do something
}
fun initValue() {
val intValue: Int
calledOneTimeOnly {
// Does not compile:
// Captured values initialization is forbidden due to possible reassignment.
intValue = 1
}
}
[https://pspdfkit.com/blog/2018/kotlin-contracts/]
위 코드에 보면 function이 한번만 호출되는 것을 컴파일러가 모르기 때문에 intValue가 재할당되지 않는걸 식별할 방법이 없다는 것이다.
Contract를 사용하면 아래처럼 쓸 수 있다.
@ExperimentalContracts
fun calledOneTimeOnly(run: ()-> Unit) {
contract {
callsInPlace(run, InvocationKind.EXACTLY_ONCE)
}
run()
}
@ExperimentalContracts
fun initValue() {
val intValue: Int
calledOneTimeOnly {
// Compiles.
intValue = 1
}
}
[https://pspdfkit.com/blog/2018/kotlin-contracts/]
종류는 아래와 같습니다.
- UNKNOWN : default
- AT_MOST_ONCE : 0 or 1번 호출
- EXACTLY_ONCE : 1번 호출 보장
- AT_LEAST_ONCE : 1번 이상 호출
널체크와 캐스팅
fun Any?.isValidString(): Boolean {
return this != null && this is String && this.length > 0
}
fun getString() : String? {
// Somehow get the string, which might be null.
}
fun testString() {
val test = getString()
if (test.isValidString()) {
// Does not compile:
// Type mismatch. Required: String. Found: String?.
val result: String = test
}
}
컴파일러가 널체크가 되었는지 알 수 없어서 Type mismatch
@ExperimentalContracts
fun Any?.isValidString(): Boolean {
contract {
returns(true) implies (this@isValidString is String)
}
return this != null && this is String && this.length > 0
}
fun getString() : String? {
return null
}
@ExperimentalContracts
fun testString() {
val test = getString()
if (test.isValidString()) {
// Compiles.
val result: String = test
}
}
returns : 값 반환한다면 컴파일러에게 특정 정보를 전달하는 것
returns(value: Any?): 함수가 특정 값을 반환하는 경우 특정 정보를 컴파일러에게 전달
returnsNotNull: nul을 반환하지 않을 경우에 특정 정보를 컴파일러에게 전달
pspdfkit.com/blog/2018/kotlin-contracts/
반응형
'코틀린' 카테고리의 다른 글
코루틴 컨텍스트 전환 (0) | 2021.11.24 |
---|---|
코루틴 디버깅 (0) | 2021.11.10 |
코루틴 콘텍스트 (Context) (0) | 2021.01.03 |
코루틴 상태는 한 방향으로 이동 (0) | 2020.12.21 |
코루틴 1탄 (0) | 2020.12.08 |