Setelah memisahkan kode ke beberapa package, kita perlu cara untuk memanggil deklarasi dari package lain. Mekanisme itu disediakan oleh statement import. Pada chapter ini kita akan membahas tiga bentuk import — tunggal, wildcard, dan alias — beserta cara menyelesaikan konflik nama ketika dua package mendefinisikan deklarasi dengan nama yang sama. Penguasaan import ini penting karena sebagian besar kode Kotlin nyata memanggil standard library dan library eksternal melalui import.

Bentuk Import di Kotlin #

Berbeda dengan Java, di Kotlin statement import tidak hanya berlaku untuk class. Kita juga mengimpor top-level function dan top-level property. Selain itu, Kotlin menyediakan fasilitas import alias sehingga kita dapat memberi nama lokal yang berbeda untuk deklarasi yang diimpor. Hal ini sangat berguna saat dua package berbeda menyediakan deklarasi dengan nama yang sama persis.

Empat bentuk import yang umum dipakai:

BentukKegunaan
import kotlin.math.sqrtImport satu deklarasi spesifik.
import kotlin.math.*Import wildcard semua deklarasi publik dari package.
import com.x.Util as UImport dengan alias untuk memendekkan atau menghindari konflik.
import com.x.foo (object/function)Import function atau property top-level.

Contoh Kode #

Kode berikut memadukan ketiga bentuk import sekaligus menunjukkan resolusi konflik antara kotlin.math.PI dan konstanta lokal PI_LOKAL:

kotlin
// File: import_statements.kt
// Mendemonstrasikan import tunggal, wildcard, alias, dan resolusi konflik.
package com.example.demo

import kotlin.math.sqrt
import kotlin.math.PI
import com.example.demo.Util as U

const val PI_LOKAL: Double = 3.14

object Util {
    fun sapa(nama: String): String = "Halo, $nama (dari Util lokal)"
}

fun hitungAkar(nilai: Double): Double = sqrt(nilai)

fun luasLingkaran(jariJari: Double): Double {
    // Konflik antara kotlin.math.PI dan PI_LOKAL; sebut eksplisit.
    return PI * jariJari * jariJari
}

fun luasLingkaranKasar(jariJari: Double): Double {
    return PI_LOKAL * jariJari * jariJari
}

fun main() {
    val akar = hitungAkar(144.0)
    println("Akar dari 144.0 = $akar")

    val luas = luasLingkaran(2.0)
    println("Luas lingkaran r=2.0 (PI penuh) = $luas")

    val luasKasar = luasLingkaranKasar(2.0)
    println("Luas lingkaran r=2.0 (PI lokal) = $luasKasar")

    // Mengakses Util melalui alias U untuk menghindari penulisan panjang.
    val salam = U.sapa("Siti")
    println(salam)
}

Output yang Dihasilkan:

text
Akar dari 144.0 = 12.0
Luas lingkaran r=2.0 (PI penuh) = 12.566370614359172
Luas lingkaran r=2.0 (PI lokal) = 12.56
Halo, Siti (dari Util lokal)

Mari kita amati baris-baris penting di atas:

  1. Baris 6 (import kotlin.math.sqrt): mengimpor function sqrt dari package kotlin.math. Setelah import, kita dapat memanggil sqrt(nilai) tanpa awalan package.
  2. Baris 7 (import kotlin.math.PI): mengimpor konstanta PI dengan presisi penuh. Karena PI juga kita definisikan ulang sebagai PI_LOKAL, kedua nama tidak saling menimpa — keduanya hidup berdampingan dalam scope yang berbeda.
  3. Baris 8 (import com.example.demo.Util as U): alias U untuk object Util. Panggilan menjadi U.sapa("Siti") alih-alih Util.sapa("Siti"). Alias juga membantu saat nama Util sudah dipakai untuk identifier lain.
  4. Baris 13 (object Util { ... }): deklarasi object local pada file yang sama. Karena diberi alias U, kita dapat memanggilnya tanpa ambiguitas.
  5. Baris 20 (return PI * jariJari * jariJari): memakai PI dari kotlin.math (karena import tunggal di atas). Hasilnya lebih presisi dibanding PI_LOKAL = 3.14.
  6. Baris 28 (val salam = U.sapa("Siti")): panggilan method sapa pada Util melalui alias.

Wildcard Import dan Kapan Dipakai #

Import wildcard (import com.example.*) membawa semua deklarasi publik dari sebuah package. Praktik ini cocok untuk package kecil dengan banyak deklarasi yang sering dipakai bersama, misalnya kotlin.math.* atau kotlinx.coroutines.*. Untuk package besar dan kode produksi, import tunggal lebih disukai karena eksplisit memperjelas asal setiap simbol.

Konflik Nama #

Konflik terjadi ketika dua package berbeda menyediakan class/function dengan nama yang sama. Solusinya ada tiga: import salah satunya saja, alias untuk salah satu, atau gunakan fully qualified name secara langsung (misalnya kotlin.math.PI). Pilihan ketiga cocok bila hanya satu titik pemakaian.

Referensi Lanjutan #

  • Packages — bagian statement import dan import rename pada panduan packages resmi

Selanjutnya #

Setelah menguasai import, pertanyaan berikutnya adalah siapa yang boleh melihat deklarasi yang kita tulis. Hal ini diatur oleh visibility modifier, topik chapter Visibility Modifiers.