반응형
https://articles.caster.io/android/handling-optional-errors-using-kotlin-sealed-classes/
-
private fun parse(url:String): ParsedData{ val result = URL_PARSE_REGEX.find(url) if( result == null){ // what to do here? } val mimeType = result.groupValues[2] val data = result.groupValues[4] return ParsedData(data, mimeType) } data class ParsedData(val data:String, val mimeType:String)위와 같은 코드가 있다.
-
result == null 일 때 일반적으로 다음과 같은 코딩이 가능할 것이다.
1. Throw an exception
2. Return null -> return type 을 nullable 로 만듬.
3. Wrapper object 를 만들어 넘김
아래와 같이 만들고, 사용측에서는 parsedData 의 null 값을 보고 로직 분기를 한다.
class ResultWrapper(val data:ParsedData? = null, val errorMessage:String? = null)
-
더 좋은 solution 이 있다. Sealed class 를 사용하는 것이다.
물론 모든 케이스에 적용 가능한 것은 아니다.
sealed class ParseResult data class Error(val errorMessage:String) : ParseResult() data class ParsedData(val data:String, val mimeType:String) : ParseResult()
사용 측에서는 smartcast 를 이용하면 된다.
private fun parse(url:String): ParseResult{ val result = URL_PARSE_REGEX.find(url) if( result == null ){ return ParseResult.Error(“No match found”) } val mimeType = result.groupValues[2] val data = result.groupValues[4] return ParseResult.ParsedData(data, mimeType) } when( parse(url) ){ is ParseResult.ParsedData -> // do something with success result is ParseResult.Error -> log(result.errorMessage) }
-
sealed class 대신 abstract class 하는 것에 대한 논쟁이 있을 수 있다.
sealed class 의 장점은…
1. abstract 로 둘 경우 project 어디서든 subclass 를 정의하도록 둘 수 있다. (원하지 않는 구현일 수 있다.) sealed class 의 경우도 subclass 를 가질 수 있지만, 반드시 같은 파일 안에서 정의되어야 한다.
2. when 구문에서 다루지 않은 type 에 대한 알림도 받을 수 있다.
-
끝!!!
반응형
'프로그래밍 놀이터 > Kotlin, Coroutine' 카테고리의 다른 글
[Kotlin] Kotlin 으로 build gradle 을 작성하자! (0) | 2020.08.10 |
---|---|
[kotlin] safe when statement (0) | 2020.08.09 |
[Kotlin] Coroutine 에 대한 이해 : 기본 용어 및 사용 (0) | 2020.08.07 |
[Koin] Koin 에 대해 알아보자 (tutorial) (0) | 2020.08.06 |
[kotlin] crossinline 에 대해 알아보자. (0) | 2020.08.05 |
댓글