Pakete
Ein grundlegendes Prinzip in der Programmierung ist das Akronym DRY: Wiederhole dich nicht.
Mehrere identische Codefragmente erfordern Wartung, wann immer Sie Korrekturen oder Verbesserungen vornehmen. Das Duplizieren von Code ist also nicht nur zusätzliche Arbeit—jede Duplikation bietet Chancen für Fehler.
Das Schlüsselwort import wiederverwendet Code aus anderen Dateien. Eine Möglichkeit, import zu verwenden, besteht darin, einen Klassen-, Funktions- oder Eigenschaftsnamen anzugeben:
import packagename.ClassName
import packagename.functionName
import packagename.propertyName
Ein Paket ist eine zugehörige Sammlung von Code. Jedes Paket ist normalerweise
dafür ausgelegt, ein bestimmtes Problem zu lösen, und enthält oft mehrere Funktionen
und Klassen. Zum Beispiel können wir mathematische Konstanten und Funktionen
aus der kotlin.math Bibliothek importieren:
// Packages/ImportClass.kt
import kotlin.math.PI
import kotlin.math.cos // Cosine
fun main() {
println(PI)
println(cos(PI))
println(cos(2 * PI))
}
/* Output:
3.141592653589793
-1.0
1.0
*/
Manchmal möchte man mehrere Drittanbieter-Bibliotheken verwenden, die Klassen oder Funktionen mit demselben Namen enthalten. Das Schlüsselwort as ermöglicht es Ihnen, beim Importieren Namen zu ändern:
// Packages/ImportNameChange.kt
import kotlin.math.PI as circleRatio
import kotlin.math.cos as cosine
fun main() {
println(circleRatio)
println(cosine(circleRatio))
println(cosine(2 * circleRatio))
}
/* Output:
3.141592653589793
-1.0
1.0
*/
as ist nützlich, wenn der Bibliotheksname schlecht gewählt oder übermäßig lang ist.
Sie können einen Import im Hauptteil Ihres Codes vollständig qualifizieren. Im folgenden Beispiel könnte der Code aufgrund der expliziten Paketnamen weniger lesbar sein, aber die Herkunft jedes Elements ist absolut klar:
// Packages/FullyQualify.kt
fun main() {
println(kotlin.math.PI)
println(kotlin.math.cos(kotlin.math.PI))
println(kotlin.math.cos(2 * kotlin.math.PI))
}
/* Output:
3.141592653589793
-1.0
1.0
*/
Um alles aus einem Paket zu importieren, verwenden Sie einen Stern:
// Packages/ImportEverything.kt
import kotlin.math.*
fun main() {
println(E)
println(E.roundToInt())
println(E.toInt())
}
/* Output:
2.718281828459045
3
2
*/
Das kotlin.math-Paket enthält eine praktische Funktion roundToInt(), die den Double-Wert auf die nächste ganze Zahl aufrundet, im Gegensatz zu toInt(), das einfach alles nach einem Dezimalpunkt abschneidet.
Um Ihren Code wiederzuverwenden, erstellen Sie ein Paket mit dem Schlüsselwort package. Die package-Anweisung muss die erste nicht-kommentare Anweisung in der Datei sein. package wird gefolgt vom Namen Ihres Pakets, der konventionell komplett in Kleinbuchstaben geschrieben wird:
// Packages/PythagoreanTheorem.kt
package pythagorean
import kotlin.math.sqrt
class RightTriangle(
val a: Double,
val b: Double
) {
fun hypotenuse() = sqrt(a * a + b * b)
fun area() = a * b / 2
}
Sie können die Quellcodedatei beliebig benennen, im Gegensatz zu Java, das erfordert, dass der Dateiname mit dem Klassennamen identisch ist.
Kotlin erlaubt Ihnen, einen beliebigen Namen für Ihr Paket zu wählen, aber es wird als guter Stil betrachtet, wenn der Paketname mit dem Verzeichnisnamen identisch ist, in dem sich die Paketdateien befinden (dies wird nicht immer der Fall für die Beispiele in diesem Buch sein).
Die Elemente im pythagorean Paket sind jetzt mit import verfügbar:
// Packages/ImportPythagorean.kt
import pythagorean.RightTriangle
fun main() {
val rt = RightTriangle(3.0, 4.0)
println(rt.hypotenuse())
println(rt.area())
}
/* Output:
5.0
6.0
*/
Im Rest dieses Buches verwenden wir package-Anweisungen für jede Datei, die Funktionen, Klassen usw. außerhalb von main() definiert, um Namenskonflikte mit anderen Dateien im Buch zu vermeiden. In der Regel werden wir jedoch keine package-Anweisung in einer Datei platzieren, die nur ein main() enthält.
Übungen und Lösungen finden Sie unter www.AtomicKotlin.com.