Suljetut Result-hierarkiat
Mukautetut tulostyypit
Suljetut Result-hierarkiat on ilmainen Kotlin Academy-oppitunti CoddyKitissä. Tämä on oppitunti 3/4. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu Kotlin Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Kotlin Academy-kurssilla on yhteensä 4 oppituntia.
Sisäänrakennettua Result-tyyppiä pidemmälle
Kotlinin Result sisältää epäonnistumistapauksessa vain poikkeuksen. Usein tarvitaan monipuolisempia, tyypitettyjä virhetietoja. sealed-luokkahierarkian avulla voidaan mallintaa täsmällisesti kaikki toimialueen mahdolliset lopputulokset.
Suljettu tulos
Määritä suljettu tyyppi, jolla on onnistumis- ja virhealiluokat. Kääntäjä tuntee kaikki tapaukset, mikä mahdollistaa kaikkien tapausten kattavan käsittelyn.
sealed class Outcome<out T> {
data class Ok<T>(val value: T) : Outcome<T>()
data class Err(val message: String) : Outcome<Nothing>()
}
fun main() {
val r: Outcome<Int> = Outcome.Ok(5)
println(r)
}Kattava when
Koska tyyppi on suljettu, sitä käsittelevä when ei tarvitse else-haaraa, ja kääntäjä varmistaa jokaisen tapauksen käsittelyn.
sealed class Outcome<out T> {
data class Ok<T>(val value: T) : Outcome<T>()
data class Err(val message: String) : Outcome<Nothing>()
}
fun describe(o: Outcome<Int>) = when (o) {
is Outcome.Ok -> "value " + o.value
is Outcome.Err -> "error " + o.message
}
fun main() {
println(describe(Outcome.Ok(9)))
println(describe(Outcome.Err("boom")))
}Tyypitetyt virhevariantit
Virheiden eri lajit voidaan mallintaa erillisinä aliluokkina, joista jokainen sisältää asiaankuuluvat tiedot. Tämä on parempi ratkaisu kuin yksi läpinäkymätön poikkeus.
sealed class Fetch<out T> {
data class Success<T>(val data: T) : Fetch<T>()
data class NotFound(val id: Int) : Fetch<Nothing>()
data class Network(val code: Int) : Fetch<Nothing>()
}
fun main() {
val r: Fetch<String> = Fetch.NotFound(42)
println(r)
}Kunkin variantin käsittely
when voi reagoida kuhunkin virhetyyppiin erikseen, ja jokaisessa haarassa ovat käytettävissä kaikki kyseisen tyypin tiedot.
sealed class Fetch<out T> {
data class Success<T>(val data: T) : Fetch<T>()
data class NotFound(val id: Int) : Fetch<Nothing>()
data class Network(val code: Int) : Fetch<Nothing>()
}
fun handle(f: Fetch<String>) = when (f) {
is Fetch.Success -> "data: " + f.data
is Fetch.NotFound -> "missing id " + f.id
is Fetch.Network -> "net error " + f.code
}
fun main() {
println(handle(Fetch.Network(503)))
}Nothing-temppu
Onnistumisarvoa sisältämättömät virhevariantit käyttävät tyyppiä Outcome<Nothing>. Koska Nothing on jokaisen tyypin alityyppi ja geneerinen tyyppi on määritelty variantiksi out, virhe sopii mihin tahansa Outcome<T>-tyyppiin.
sealed class Res<out T> {
data class Ok<T>(val v: T) : Res<T>()
object Empty : Res<Nothing>()
}
fun get(flag: Boolean): Res<String> =
if (flag) Res.Ok("hi") else Res.Empty
fun main() {
println(get(false))
}object tilattomiin tapauksiin
Jos virhevariantti ei sisällä tietoja, määritä se object-singletoniksi luokan sijaan.
sealed class Login {
data class Success(val user: String) : Login()
object WrongPassword : Login()
object Locked : Login()
}
fun main() {
val r: Login = Login.WrongPassword
println(r === Login.WrongPassword)
}Hierarkian palauttaminen
Funktiot palauttavat suljetun tyypin; kutsujien on käsiteltävä jokainen lopputulos, mikä poistaa unohtuneet virhepolut.
sealed class Parsed {
data class Num(val value: Int) : Parsed()
data class Bad(val input: String) : Parsed()
}
fun parse(s: String): Parsed {
val n = s.toIntOrNull()
return if (n != null) Parsed.Num(n) else Parsed.Bad(s)
}
fun main() {
when (val r = parse("x")) {
is Parsed.Num -> println(r.value)
is Parsed.Bad -> println("bad: " + r.input)
}
}Suljettu hierarkia ja sisäänrakennettu Result
Käytä sisäänrakennettua Result-tyyppiä nopeaan, poikkeuksiin perustuvaan sieppaukseen. Käytä mukautettua suljettua hierarkiaa, kun tarvitset useita tyypitettyjä virhetapauksia, joissa on toimialuekohtaista tietoa ja kattava käsittely.
Hierarkian suunnittelu
Hyvän suljetun tuloshierarkian ominaisuudet:
- Yksi hyötykuorman sisältävä onnistumisvariantti
- Yksi aliluokka jokaista merkityksellistä epäonnistumistapaa kohden
out T-varianttisuus sekäNothingvain virheen sisältäville tapauksille
Kääntäjä turvaverkkona
Suurin hyöty on tämä: kun myöhemmin lisätään uusi variantti, jokaisesta kattamattomasta when-lausekkeesta tulee käännösvirhe, joka osoittaa kaikki kohdat, joissa se on käsiteltävä. Virheet eivät voi jäädä huomaamatta.
Pikatarkistus
Testaa, miten hyvin ymmärrät suljetut tuloshierarkiat.
Kertaus
Rakensit suljettuja tuloshierarkioita:
- Onnistuminen ja tyypitetyt virhevariantit
- Kattava
whenilmanelse-haaraa out TjaNothingvain virheen sisältäville tapauksille- Kääntäjä varmistaa uusien varianttien käsittelyn
Seuraavaksi: funktionaalinen virheenkäsittely map- ja recover-metodeilla.
Opi Kotlin tekoälytuutorin avulla — ilmaiseksi
Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.
- Kurssit
- 51
- Oppitunnit
- 203
Usein kysytyt kysymykset
Onko oppitunti ”Suljetut Result-hierarkiat” ilmainen?
Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa Kotlin Academy-oppimispolun 3 oppituntia, myös oppitunnin “Suljetut Result-hierarkiat”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Kotlin Academy-kurssilla on yhteensä 4 oppituntia.
Mitä opin oppitunnilla ”Suljetut Result-hierarkiat”?
Mukautetut tulostyypit Harjoittelet Kotlin Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.
Tarvitsenko kokemusta aloittaakseni Kotlin Academy-opiskelun?
Aiempi kokemus ei ole tarpeen. CoddyKitin Kotlin Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 3/4.
Kuinka kauan ”Suljetut Result-hierarkiat”-oppitunnin suorittaminen kestää?
Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.
Voinko kirjoittaa ja suorittaa koodia tällä Kotlin Academy-oppitunnilla?
Kyllä. Jokainen Kotlin Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.
Kaikki tämän kurssin oppitunnit
- Result-tyyppi
- runCatching
- Suljetut Result-hierarkiat
- Funktionaalinen virheenkäsittely