パッケージとインポート
Kotlinプロジェクトでは、コードはパッケージとインポートを使用して整理されます。
- パッケージは、1つ以上のKotlinファイルのコンテナです。ファイルは
packageヘッダーを使用してパッケージにリンクされます。 - インポートは、他のパッケージのエンティティを現在のファイルで利用可能にするためのディレクティブです。
パッケージヘッダー
ソースファイルはパッケージヘッダーから始まる場合があります。
package org.example
fun printMessage() { /*...*/ }
class Message(val text: String) { /*...*/ }クラスや関数といったソースファイルのすべての内容は、このパッケージに含まれます。 それらの完全修飾名(fully qualified name)は、パッケージ名とエンティティ名を組み合わせたものになります。 この例では:
printMessage()の完全修飾名はorg.example.printMessageです。Messageの完全修飾名はorg.example.Messageです。
ファイルにパッケージヘッダーがない場合、その内容はルートパッケージ(root package)に属します。
インポート
別のパッケージにあるファイルのエンティティを使用するには、import ディレクティブを使用します。 デフォルトのインポートに加えて、各ファイルには独自のインポートを宣言できます。
単一のエンティティをインポートする
特定のエンティティをインポートすると、修飾なしでそれを使用できるようになります:
// Message に修飾なしでアクセスできるようになります
import org.example.Message
fun main() {
val message = Message("Hello")
println(message.text)
}スコープ内の内容をインポートする
アスタリスク * で終わるスターインポート(star import)は、対応するスコープ内のすべての名前付きエンティティをインポートします:
// org.example 内のすべてのものにアクセスできるようになります
import org.example.*
fun main() {
printMessage()
val message = Message("Hi")
}スターインポートと明示的なインポートの両方で同じエンティティをインポートした場合、オーバーロード解決(overload resolution)の際には明示的なインポートが優先されます。
エイリアスを使用して名前の衝突を解決する
インポートした2つのエンティティが同じ名前の場合、as キーワードを使用して、そのうちの1つをローカルでリネームできます:
// Message は org.example.Message を指す
import org.example.Message
// TestMessage は org.test.Message を指す
import org.test.Message as TestMessage
fun main() {
val a = Message("from example")
val b = TestMessage("from test")
}インポートできるもの
import キーワードはクラスだけに限定されません。パッケージ、クラス、オブジェクト、またはenumのいずれに属しているかにかかわらず、以下のエンティティをインポートできます:
- パッケージ内に直接宣言されたトップレベルの関数とプロパティ:kotlin
import org.example.printMessage // トップレベル関数 import org.example.VERSION // トップレベルプロパティ - オブジェクト宣言の関数とプロパティ:kotlin
import org.example.Config.DEFAULT_TIMEOUT // オブジェクトのプロパティ import org.example.Config.loadSettings // オブジェクトの関数 - 包摂するクラス名を介して参照されるコンパニオンオブジェクトのメンバー:kotlin
import org.example.MyClass.create // MyClass.Companion.create を指す - enum 定数:kotlin
import org.example.Color.RED import org.example.Color.GREEN - ネストしたクラス:kotlin
import org.example.Outer.Nested
デフォルトのインポート
デフォルトで、多数のパッケージがすべての Kotlin ファイルにインポートされます。
- kotlin.*
- kotlin.annotation.*
- kotlin.collections.*
- kotlin.comparisons.*
- kotlin.io.*
- kotlin.ranges.*
- kotlin.sequences.*
- kotlin.text.*
- kotlin.math.*
ターゲットプラットフォームに応じて、追加のパッケージがインポートされます。
可視性とインポート
エンティティをインポートできるかどうかは、その可視性修飾子に依存します:
publicエンティティはどこでもインポートできます。internalエンティティは、同じモジュール内でのみインポートできます。protectedエンティティはインポートできません。- トップレベルの
privateエンティティは、それが宣言されているファイル内でのみアクセス可能です。 - その他の
privateエンティティはインポートできません。
