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
- Funzioni di estensione: sintassi e regole di dispatch
- Proprietà di estensione ed estensioni calcolate
- Estensioni con ambito ed estensioni del companion
- Estensioni pratiche: helper per Context, View e String