0Pricing
Kotlin Academy · Lezione

Estensioni con ambito ed estensioni del companion

Limiti la visibilità delle estensioni e ne aggiunga alle companion object.

Estensioni con ambito ed estensioni del companion è una lezione Kotlin Academy gratuita su CoddyKit. Questa è la lezione 3 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Kotlin Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Kotlin Academy include 4 lezioni in totale.

Perché utilizzare estensioni con ambito

Per impostazione predefinita, le estensioni sono visibili ovunque vengano importate. Limitare l'ambito ne circoscrive la visibilità a una classe, un file o un contesto, riducendo l'inquinamento del namespace e migliorandone l'individuabilità.

Estensioni private a livello di file

Contrassegni una funzione di estensione con private a livello di file per limitarla esclusivamente a quel file.

private fun String.shout() = uppercase() + "!"
fun main() {
    println("hello".shout()) // HELLO!
}

Visibilità internal

Utilizzi internal per limitare le estensioni al modulo corrente: è ideale per gli elementi interni di una libreria non destinati all'uso esterno.

internal fun List<Int>.sumIfPositive(): Int = filter { it > 0 }.sum()
fun main() {
    println(listOf(-1, 2, 3, -4).sumIfPositive()) // 5
}

Funzioni di estensione membro

Dichiari un'estensione all'interno di una classe per renderla utilizzabile solo quando un'istanza di quella classe si trova nell'ambito. Sono presenti due ricevitori: quello di dispatch (la classe) e quello di estensione (la destinazione).

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
}

Visibilità delle estensioni membro

Le estensioni membro non sono accessibili dall'esterno della classe di dispatch. Sono utili per l'incapsulamento.

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
}

Estensione del companion object

Aggiunga un'estensione al companion object di una classe. Per chi la chiama appare come un metodo statico, ma risiede al di fuori della classe.

class Greeter {
    companion object
}
fun Greeter.Companion.morning() = "Good morning!"
fun main() {
    println(Greeter.morning())
}

Perché utilizzare le estensioni dei companion object

Sono utili per aggiungere factory method o helper dall'esterno della classe originale, senza modificarla.

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)
}

Companion vuoto obbligatorio

Una classe deve dichiarare un companion object (anche vuoto) affinché sia possibile collegarvi estensioni. In caso contrario, la destinazione dell'estensione non esiste.

class Box {
    companion object // required, even if empty
}
fun Box.Companion.create(): Box = Box()
fun main() {
    println(Box.create())
}

Estensioni con ambito tramite import

Può limitare l'uso di un'estensione importandola solo in file specifici. I file che non la importano non possono vederla.

// 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()) }

Funzione di estensione tramite una funzione di ambito

Utilizzi with o apply per portare temporaneamente un oggetto nell'ambito e utilizzarlo con un'estensione.

class StringTools {
    fun String.greet() = "Hello, $this!"
    fun process(name: String) = with(this) {
        name.greet()
    }
}
fun main() {
    println(StringTools().process("Ada"))
}

Proprietà di estensione sul companion

Le estensioni del companion possono essere anche proprietà: aggiunga costanti denominate dall'esterno della classe.

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)
}

Buone pratiche

Utilizzi private per gli helper locali al file, internal per le API limitate al modulo, le estensioni membro per l'incapsulamento e le estensioni del companion per aggiungere helper simili a factory dall'esterno.

class StringUtils {
    companion object
}
fun StringUtils.Companion.isAlpha(s: String) = s.all { it.isLetter() }
fun main() {
    println(StringUtils.isAlpha("hello"))
    println(StringUtils.isAlpha("hi5"))
}

Verifica rapida

Che cosa è necessario dichiarare in una classe per poter aggiungere un'estensione del companion dall'esterno?

Riepilogo

Limiti la visibilità delle estensioni usando private, internal o definendole come estensioni membro all'interno di una classe. Aggiunga estensioni del companion (funzioni o proprietà) dall'esterno collegandole al companion object dichiarato dalla classe. In questo modo riduce l'inquinamento dello spazio dei nomi mantenendo il codice modulare.

Domande Frequenti

La lezione «Estensioni con ambito ed estensioni del companion» è gratuita?

Sì — il testo completo di «Estensioni con ambito ed estensioni del companion» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Kotlin Academy, passa a CoddyKit PRO. Il corso Kotlin Academy include 4 lezioni in totale.

Cosa imparerò in «Estensioni con ambito ed estensioni del companion»?

Limiti la visibilità delle estensioni e ne aggiunga alle companion object. Eserciti Kotlin Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare Kotlin Academy?

Non è richiesta alcuna esperienza precedente. Kotlin Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 3 di 4.

Quanto tempo richiede la lezione «Estensioni con ambito ed estensioni del companion»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione Kotlin Academy?

Sì. Ogni lezione Kotlin Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Funzioni di estensione: sintassi e regole di dispatch
  2. Proprietà di estensione ed estensioni calcolate
  3. Estensioni con ambito ed estensioni del companion
  4. Estensioni pratiche: helper per Context, View e String
← Torna a Kotlin Academy