プロジェクト

全般

プロフィール

Kotlinいろいろメモ

Kotlinでプログラミング事始め

Kotlinでプログラミングを始めるには? をメモ

用意するもの

Kotlin言語の開発元であるJetBrains社のIDE(統合開発環境)であるIntelliJ IDEAが最も苦労なくKotlinの開発ができます。EclipseやNetBeans IDEにもKotlinプラグインは存在するようですが、設定に苦労するだけでなく、安定性に欠けるので、IntelliJ IDEA(もしくはAndroid Studio)一択です。IDEを使わないのは、まともな武具を持たずに戦に出るようなもの…。

  • Java SE Development Kit
  • IntelliJ IDEA Community Edition

ソースファイル

Kotlinは、Javaと違って必ずしもソースファイル名とクラス名を一致させなくても、パッケージとディレクトリを一致させなくても、複数のクラスを1つのファイルにまとめても構いません。しかし、Javaに合わせておくと混乱が少ないので、基本的にはJavaのやり方に合わせます。

クラスとクラスに関係するトップレベル関数や拡張関数を一つのファイルに記述し、ファイル名はクラス名に合わせます。
パッケージ名に合わせたディレクトリ階層にソースファイルを配置します。

クラスの定義

定義しようとするクラスの目的・用途を確認します。

クラスの種類

  • データクラス(値クラス)かどうか
    コレクションに詰めることがあるクラス、インスタンスを比較するときにインスタンスそのものの一致ではなく、インスタンスの持ついくつかの値の一致で判断するクラスはデータクラス(data class)が適しています。
  • シングルトンかどうか
    定義したクラスのインスタンスは1つだけしか存在しない場合(シングルトンパターンは厳密にはインスタンスが1つだけではなくインスタンスの数を制限するものですが)は、オブジェクトクラス(object)が適しています。
  • 列挙型(enum)かどうか

クラスの公開・継承可否

クラスのデフォルトのアクセス修飾子はpublicです。パッケージ外に公開しない場合は、internalもしくはprivateとします。

Kotlinのアクセス修飾 意味 Javaでは
public 他のパッケージに公開。Kotlinはアクセス修飾子を省略するとこれになる public
internal 一緒にコンパイルするファイルに公開。 Javaに該当するアクセス修飾なし
protected サブクラスに公開。同一パッケージには非公開。 Javaのprotectedに近いが、パッケージ内公開可否の点が違う
private クラス内にのみ公開 private

クラスのデフォルトの継承可否は否(Javaでのfinalクラス)です。
openを付けると、継承可となります。

言語仕様

クラスを定義する

プライマリコンストラクタ

  • class宣言と一緒にコンストラクタ引数を指定する
    • コンストラクタ引数は、初期化ブロック内で参照可能
  • コンストラクタ引数宣言のみでコードは記述できない
    • 初期化ブロックにコードを記述
  • コンストラクタ引数にvalまたはvarを付けると、クラスのプロパティとして定義される

次は同じクラスが定義される

class User(val nickname: String)
class User constructor(_nickname: String) {
    val nickname: String
    init {
        nickname = _nickname
    }
}
class User(_nickname: String) {
    val nickname = _nickname
}

バイトコード

Kotlinソースファイルからコンパイルされたバイトコードに関するメモ

トップレベル関数とクラス

1つのソースファイル(Hello.kt)に、クラスHelloとトップレベル関数sayHelloを定義したとします。

class Hello (val message: String)

fun main(args: Array<String>) {
    println("Hello")
}

これをKotlinコンパイラでコンパイルすると、2つのクラスファイル Hello.class, HelloKt.class が生成されます。
Hello.classには、クラスHelloの定義が書かれ、HelloKt.classには、クラスHelloKtとその中にstaticメソッドmainの定義が書かれています。

クリップボードから画像を追加 (サイズの上限: 1 GB)