코틀린에서 더 좋은 코드를 만들기 위해 기대한다면 아래의 함수들을 빠르게 선언하고 적용해야합니다.
return
혹은 throw
를 던집니다.이런 선언적인 검사들을 했을 때 까지는 장점
require
함수를 사용하여 예외를 발생 가능하게 하는것입니다.var someState: String? = null
fun getStateValue(): String {
val state = checkNotNull(someState) { "State must be set beforehand" }
check(state.isNotEmpty()) { "State must be non-empty" }
// ...
return state
}
// getStateValue() // will fail with IllegalStateException
someState = ""
// getStateValue() // will fail with IllegalStateException
someState = "non-empty-state"
println(getStateValue()) // non-empty-state
check()
는 require()
와 유사하게 동작하지만 명시된 조건이 충족되지 않으면 illegalStateException
을 발생시킵니다.require()
과 마찬가지로 lazyMessage 람다함수를 블록을 통해 정의할 수 있습니다.check()
를 이용해서 검사합니다. fun getIndices(count: Int): List<Int> {
require(count >= 0) { "Count must be non-negative, was $count" }
// ...
return List(count) { it + 1 }
}
// getIndices(-1) // will fail with IllegalArgumentException
println(getIndices(3)) // [1, 2, 3]
보통은 프로덕션에서 오류가 발생하지 않고 테스트를 실행할 때만 Kotlin/JVM에서 활성화됩니다. 보통 사용자가 오류를 마주하기 전에 테스트를 선행하여 오류를 확인할 수 있습니다. 만약 심각한 오류를 발생할 가능성이 있다면 check()
를 대신하여 사용해야합니다. 다음은 단위테스트 대신에 함수에서 assertion
검사를 하는 경우 장점으로 작용하는 점입니다.
Assertion
은 자체 검사를 통해 더 효과적인 테스트로 만듭니다require
함수 혹은 check
함수는 어떤 조건을 확인후에 true가 나왔다면 이후에도 true일거라고 가정합니다. 만약 null 체크와 같이 require
과 check
를 사용하려면 requireNotNull
및 checkNotNull
과 같은 함수를 사용할 수 있습니다.
fun printRequiredParam(params: Map<String, String?>) {
val required: String = requireNotNull(params["required"]) { "Required value must be non-null" } // returns a non-null value
println(required)
// ...
}
var someState: String? = null
fun getStateValue(): String {
val state = checkNotNull(someState) { "State must be set beforehand" }
check(state.isNotEmpty()) { "State must be non-empty" }
// ...
return state
}
// getStateValue() // will fail with IllegalStateException
someState = ""
// getStateValue() // will fail with IllegalStateException
someState = "non-empty-state"
println(getStateValue()) // non-empty-state
엘비스 연산자는 return
혹은 throw
가 nullability를 목적으로하는 변수에 대해서는 사용하는 것을 권장합니다.
글 잘봤습니다.!
예시 코드스니펫이 반대로 되어 있는거 같아서요.
require와 check 예시문 정정해서 올려주시면 좋겠습니다!