Scoped Extensions und Companion Extensions
Beschränken Sie die Sichtbarkeit von Extensions und fügen Sie Companion Objects Extensions hinzu.
Scoped Extensions und Companion Extensions ist eine kostenlose Kotlin Academy-Lektion auf CoddyKit. Dies ist Lektion 3 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Kotlin Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Kotlin Academy-Kurs umfasst insgesamt 4 Lektionen.
Warum Extensions mit Gültigkeitsbereich?
Standardmäßig sind Extensions überall sichtbar, wo sie importiert wurden. Durch die Einschränkung auf eine Klasse, Datei oder einen Kontext wird die Sichtbarkeit begrenzt — das reduziert die Verschmutzung des Namespace und verbessert die Auffindbarkeit.
Dateilokale Extensions
Markieren Sie eine Extension Function auf Dateiebene mit private, damit sie nur in dieser Datei gültig ist.
private fun String.shout() = uppercase() + "!"
fun main() {
println("hello".shout()) // HELLO!
}Interne Sichtbarkeit
Verwenden Sie internal, um Extensions auf das aktuelle Modul zu beschränken — ideal für interne Bibliotheksfunktionen, die nicht für die externe Verwendung vorgesehen sind.
internal fun List<Int>.sumIfPositive(): Int = filter { it > 0 }.sum()
fun main() {
println(listOf(-1, 2, 3, -4).sumIfPositive()) // 5
}Member Extension Functions
Deklarieren Sie eine Extension innerhalb einer Klasse, damit sie nur verwendet werden kann, wenn eine Instanz dieser Klasse im Gültigkeitsbereich liegt. Sie besitzt zwei Receiver: den Dispatch-Receiver (die Klasse) und den Extension-Receiver (das Ziel).
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
}Sichtbarkeit von Member Extensions
Auf Member Extensions kann außerhalb der Dispatch-Klasse nicht zugegriffen werden. Das ist nützlich für die Kapselung.
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
}Extension für ein Companion Object
Fügen Sie dem Companion Object einer Klasse eine Extension hinzu. Für Aufrufer sieht sie wie eine statische Methode aus, befindet sich aber außerhalb der Klasse.
class Greeter {
companion object
}
fun Greeter.Companion.morning() = "Good morning!"
fun main() {
println(Greeter.morning())
}Warum Companion Extensions?
Sie eignen sich, um Factory-Methoden oder Hilfsfunktionen von außerhalb der ursprünglichen Klasse hinzuzufügen — ohne diese zu verändern.
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)
}Ein leeres Companion Object ist erforderlich
Eine Klasse muss ein Companion Object deklarieren (auch wenn es leer ist), damit Companion Extensions daran angehängt werden können. Andernfalls existiert das Extension-Ziel nicht.
class Box {
companion object // required, even if empty
}
fun Box.Companion.create(): Box = Box()
fun main() {
println(Box.create())
}Extensions durch Imports begrenzen
Sie können die Verwendung einer Extension einschränken, indem Sie sie nur in bestimmten Dateien importieren. Dateien, die sie nicht importieren, können sie nicht sehen.
// 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()) }Extension Function mit einer Scope Function
Verwenden Sie with oder apply, um ein Objekt für die Verwendung von Extensions vorübergehend in den Gültigkeitsbereich zu holen.
class StringTools {
fun String.greet() = "Hello, $this!"
fun process(name: String) = with(this) {
name.greet()
}
}
fun main() {
println(StringTools().process("Ada"))
}Erweiterungseigenschaften für Companion
Companion-Erweiterungen können ebenfalls Eigenschaften sein – fügen Sie benannte Konstanten außerhalb der Klasse hinzu.
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)
}Bewährte Vorgehensweisen
Verwenden Sie private für dateilokale Hilfsfunktionen, internal für APIs, die auf das Modul beschränkt sind, Member-Erweiterungen zur Kapselung und Companion-Erweiterungen, um von außerhalb fabrikähnliche Hilfsfunktionen hinzuzufügen.
class StringUtils {
companion object
}
fun StringUtils.Companion.isAlpha(s: String) = s.all { it.isLetter() }
fun main() {
println(StringUtils.isAlpha("hello"))
println(StringUtils.isAlpha("hi5"))
}Kurze Überprüfung
Was muss in einer Klasse vorhanden sein, damit Sie von außerhalb eine Companion-Erweiterung hinzufügen können?
Zusammenfassung
Schränken Sie Erweiterungen mit private, internal oder als Member-Erweiterungen innerhalb einer Klasse ein. Fügen Sie von außerhalb Companion-Erweiterungen (Funktionen oder Eigenschaften) hinzu, indem Sie sie an das deklarierte Companion-Objekt der Klasse anhängen. So verringern Sie die Verschmutzung des Namensraums und halten den Code modular.
Häufig gestellte Fragen
Ist die Lektion „Scoped Extensions und Companion Extensions“ kostenlos?
Ja — der vollständige Text von „Scoped Extensions und Companion Extensions“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Kotlin Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Kotlin Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Scoped Extensions und Companion Extensions“?
Beschränken Sie die Sichtbarkeit von Extensions und fügen Sie Companion Objects Extensions hinzu. Du übst Kotlin Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um Kotlin Academy zu starten?
Keine Vorkenntnisse erforderlich. Kotlin Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 3 von 4.
Wie lange dauert die Lektion „Scoped Extensions und Companion Extensions“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser Kotlin Academy-Lektion Code schreiben und ausführen?
Ja. Jede Kotlin Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Extension Functions: Syntax und Dispatch-Regeln
- Extension Properties und berechnete Extensions
- Scoped Extensions und Companion Extensions
- Praktische Extensions: Context-, View- und String-Hilfsfunktionen