package și import în Kotlin

Bazele programului Kotlin 1.0

package stabilește numele pachetului unui fișier; import aduce în fișier clase și funcții din alte pachete.

Sintaxă
package ro.magazin.facturi

import kotlin.math.sqrt
import kotlin.math.*
import java.time.LocalDate as Data

Ce face package și import

package se scrie pe primul rând al fișierului și spune cărui pachet îi aparțin clasele și funcțiile din el, de exemplu package ro.magazin. Pachetele separă codul pe zone și evită conflictele de nume: ro.magazin.Produs și ro.depozit.Produs sunt clase diferite. Spre deosebire de Java, numele pachetului nu trebuie să se potrivească cu directorul, dar este o convenție bună.

import (după package) îți permite să scrii numele scurt al unei clase sau funcții din alt pachet: import kotlin.math.sqrt, apoi sqrt(2.0). Cu * imporți tot ce e public în pachet. Cu as dai un alt nume la import, util când două clase au același nume.

Unele pachete sunt importate automat în orice fișier: kotlin.*, kotlin.collections.*, kotlin.text.*, kotlin.ranges.*, kotlin.io.* și, pe JVM, java.lang.*. De aceea println, listOf sau String merg fără import. kotlin.math nu este printre ele.

Exemple

Exemplul 1: Fișier cu pachet și importuri

Funcțiile din kotlin.math au nevoie de import. Clasa generată pentru fișier primește numele complet ro.magazin.MainKt.

package ro.magazin

import kotlin.math.PI
import kotlin.math.roundToInt
import kotlin.math.sqrt

fun main() {
    val suprafata = 50.0
    val latura = sqrt(suprafata)
    println("Latura unui teren pătrat de 50 m²: ${(latura * 100).roundToInt() / 100.0} m")
    println("Aria unei mese rotunde cu raza 0,6 m: ${(PI * 0.6 * 0.6 * 100).roundToInt() / 100.0} m²")
    println("Pachetul: " + object {}.javaClass.enclosingClass.name)
}

Rezultat

Latura unui teren pătrat de 50 m²: 7.07 m
Aria unei mese rotunde cu raza 0,6 m: 1.13 m²
Pachetul: ro.magazin.MainKt

Exemplul 2: Import cu nume nou (as)

as redenumește ce imporți. Aici clasa Java LocalDate devine Data, iar java.util.Locale rămâne cu numele ei.

import java.time.LocalDate as Data
import java.time.format.DateTimeFormatter
import java.util.Locale

fun main() {
    val examen = Data.of(2026, 6, 15)
    val format = DateTimeFormatter.ofPattern("EEEE, d MMMM yyyy", Locale.forLanguageTag("ro"))
    println("Examenul de bacalaureat: ${examen.format(format)}")
    println("Cu o săptămână înainte: ${examen.minusWeeks(1)}")
}

Rezultat

Examenul de bacalaureat: luni, 15 iunie 2026
Cu o săptămână înainte: 2026-06-08

Exemplul 3: Două fișiere, două pachete

Funcția cuTva stă în pachetul ro.magazin.preturi. Fișierul cu main o importă. Se compilează împreună: kotlinc main.kt preturi.kt -include-runtime -d app.jar.

// preturi.kt
package ro.magazin.preturi

fun cuTva(pret: Double): Double = pret * 1.21

// main.kt
package ro.magazin

import ro.magazin.preturi.cuTva

fun main() {
    println("Pâine: ${cuTva(5.0)} lei cu TVA")
}

Rezultat în terminal (java -jar app.jar)

Pâine: 6.05 lei cu TVA

Greșeli frecvente

  • import scris înainte de package: ordinea obligatorie este package, apoi importurile, apoi codul.
  • Importuri pe care nu le folosești: compilatorul nu avertizează, dar fac codul greu de citit. IDE-ul le poate șterge automat.
  • import kotlin.math.* când ai și o funcție proprie max sau min: se poate apela alta decât te aștepți. Importă explicit numele de care ai nevoie.

Comenzi înrudite

  • fun main(): Funcția main este punctul de pornire al oricărui program Kotlin: codul din ea se execută primul.
  • as și as? (conversie de tip): as tratează o valoare ca alt tip (aruncă excepție dacă nu se potrivește); as? întoarce null în loc de excepție.
  • public și internal: public (implicit) face o declarație vizibilă oriunde; internal o face vizibilă doar în modulul în care este scrisă.
  • kotlinc: Compilatorul Kotlin din linia de comandă: transformă fișierele .kt într-un program care rulează pe JVM.