Rajatut laajennukset ja companion-laajennukset
Rajoittakaa laajennusten näkyvyyttä ja lisätkää laajennuksia companion object -olioihin.
Rajatut laajennukset ja companion-laajennukset 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.
Miksi laajennusten näkyvyyttä rajataan
Oletusarvoisesti laajennukset ovat näkyvissä kaikkialla, missä ne on tuotu käyttöön. Näkyvyyden rajaaminen luokkaan, tiedostoon tai kontekstiin vähentää nimiavaruuden saastumista ja helpottaa ominaisuuksien löytämistä.
Tiedostokohtaiset private-laajennukset
Merkitkää laajennusfunktio tiedostotasolla private-määritteellä, jotta se on käytettävissä vain kyseisessä tiedostossa.
private fun String.shout() = uppercase() + "!"
fun main() {
println("hello".shout()) // HELLO!
}Internal-näkyvyys
Käyttäkää internal-määritettä rajoittaaksenne laajennusten näkyvyyden nykyiseen moduuliin – tämä sopii erinomaisesti kirjaston sisäiseen käyttöön, jota ei ole tarkoitettu ulkopuolisille.
internal fun List<Int>.sumIfPositive(): Int = filter { it > 0 }.sum()
fun main() {
println(listOf(-1, 2, 3, -4).sumIfPositive()) // 5
}Jäsenlaajennusfunktiot
Määritelkää laajennus luokan sisällä, jotta sitä voi käyttää vain, kun kyseisen luokan ilmentymä kuuluu näkyvään kontekstiin. Laajennuksella on kaksi vastaanottajaa: dispatch-vastaanottaja (luokka) ja extension-vastaanottaja (kohdetyyppi).
class StringHelper(val prefix: String) {
fun String.withPrefix() = prefix + this
fun build(): String = "world".withPrefix() // calls extension via instance
}
fun main() {
println(StringHelper("hello ").build()) // hello world
}Jäsenlaajennusten näkyvyys
Jäsenlaajennuksia ei voi käyttää dispatch-luokan ulkopuolelta. Tämä on hyödyllistä kapseloinnissa.
class Repo {
fun List<Int>.allPositive() = all { it > 0 }
fun check(xs: List<Int>) = xs.allPositive()
}
fun main() {
val r = Repo()
println(r.check(listOf(1, 2, 3))) // true
// listOf(1).allPositive() // ERROR — no access
}Companion objectin laajentaminen
Lisätkää laajennus luokan companion objectiin. Kutsujasta se näyttää staattiselta metodilta, mutta sijaitsee luokan ulkopuolella.
class Greeter {
companion object
}
fun Greeter.Companion.morning() = "Good morning!"
fun main() {
println(Greeter.morning())
}Miksi companion-laajennuksia käytetään
Ne ovat hyödyllisiä tehdasmetodien tai apufunktioiden lisäämiseen alkuperäisen luokan ulkopuolelta – ilman luokan muuttamista.
class User(val name: String) {
companion object
}
fun User.Companion.guest() = User("Guest")
fun User.Companion.system() = User("System")
fun main() {
println(User.guest().name)
println(User.system().name)
}Tyhjä companion tarvitaan
Luokan täytyy määritellä companion object (vaikka tyhjäkin), jotta companion-laajennukset voidaan liittää siihen. Muuten laajennuksen kohdetta ei ole olemassa.
class Box {
companion object // required, even if empty
}
fun Box.Companion.create(): Box = Box()
fun main() {
println(Box.create())
}Laajennusten rajaaminen import-lauseilla
Voitte rajata laajennuksen käytön tuomalla sen import-lauseella vain tiettyihin tiedostoihin. Tiedostot, joissa sitä ei tuoda käyttöön, eivät näe sitä.
// File A:
// fun String.shout() = uppercase()
// File B imports:
// import com.example.shout
// Only File B can call shout()
fun String.shout() = uppercase() + "!"
fun main() { println("hi".shout()) }Laajennusfunktio scope-funktion avulla
Käyttäkää with- tai apply-funktiota tuodaksenne olion väliaikaisesti näkyvään kontekstiin laajennuksen käyttöä varten.
class StringTools {
fun String.greet() = "Hello, $this!"
fun process(name: String) = with(this) {
name.greet()
}
}
fun main() {
println(StringTools().process("Ada"))
}Companion-olion laajennusominaisuudet
Companion-laajennukset voivat olla myös ominaisuuksia — lisätkää nimettyjä vakioita luokan ulkopuolelta.
class HttpStatus {
companion object
}
val HttpStatus.Companion.OK_CODE: Int get() = 200
val HttpStatus.Companion.NOT_FOUND: Int get() = 404
fun main() {
println(HttpStatus.OK_CODE)
println(HttpStatus.NOT_FOUND)
}Parhaat käytännöt
Käyttäkää private-määrettä tiedostokohtaisille apufunktioille, internal-määrettä vain moduulin käytettävissä oleville rajapinnoille, jäsenlaajennuksia kapselointiin ja Companion-laajennuksia tehdessänne tehdasmetodien kaltaisia apufunktioita luokan ulkopuolelta.
class StringUtils {
companion object
}
fun StringUtils.Companion.isAlpha(s: String) = s.all { it.isLetter() }
fun main() {
println(StringUtils.isAlpha("hello"))
println(StringUtils.isAlpha("hi5"))
}Pikatarkistus
Mitä luokalta vaaditaan, jotta siihen voidaan lisätä Companion-laajennus luokan ulkopuolelta?
Kertaus
Rajaatte laajennusten näkyvyyttä käyttämällä private- tai internal-määrettä tai määrittelemällä ne luokan sisäisiksi jäsenlaajennuksiksi. Lisätkää luokan ulkopuolelta Companion-laajennuksia (funktioita tai ominaisuuksia) liittämällä ne luokassa määriteltyyn companion-olioon. Näin nimiavaruus pysyy siistimpänä ja koodi modulaarisena.
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 ”Rajatut laajennukset ja companion-laajennukset” ilmainen?
Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa Kotlin Academy-oppimispolun 3 oppituntia, myös oppitunnin “Rajatut laajennukset ja companion-laajennukset”. 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 ”Rajatut laajennukset ja companion-laajennukset”?
Rajoittakaa laajennusten näkyvyyttä ja lisätkää laajennuksia companion object -olioihin. 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 ”Rajatut laajennukset ja companion-laajennukset”-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
- Laajennusfunktiot: syntaksi ja kutsunvälityksen säännöt
- Laajennusominaisuudet ja lasketut laajennukset
- Rajatut laajennukset ja companion-laajennukset
- Käytännön laajennukset: Context-, View- ja String-apufunktiot