constructor (Kotlin)

読み:こんすとらくたー
外語:constructor 英語
品詞:名詞

Kotlinにおけるコンストラクターを定義する予約語

目次

constructorはKotlinのソフトキーワードとして定義されている。これは適用可能な範囲が決まっている予約語である。

constructorキーワードは、プライマリーコンストラクターの定義とセカンダリーコンストラクターの定義に使うことができる。

classの定義時(プライマリーコンストラクター)と、そのclassブロック内の直下(セカンダリーコンストラクター)に記述された場合はコンストラクターの定義に使われるが、それ以外の箇所では変数に使うことも可能。

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

Kotlinで、引数のあるclassを定義することは珍しいことではない。この場合、次のように書くのが一般的である。

class Hoge(foo: String) { ... }

しかしこれは実は省略形であり、()の中がコンストラクターになっていて、省略しない場合は次のように書かれる。

class Hoge constructor(foo: String) { ... }

ここに書くconstructorキーワードは、可視性修飾子やアノテーションがなければ省略できるため、通常は冗長なので書かれないが、このようなものをプライマリーコンストラクターという。可視性の指定は次のようにすると可能である。

class Hoge private constructor(foo: String) { ... }

言い換えれば、引数のないclassは、プライマリーコンストラクターがない、と言うことができる。

プライマリーコンストラクターがあってもなくても、初期化が必要な場合はinitで初期化ブロックを定義することができる。

セカンダリーコンストラクター

プライマリーコンストラクターでは足りない場合、classのブロック内に別途、セカンダリーコンストラクターを1個以上書くことができる。これは、引数が異なるコンストラクターが必要な場合によく使われる手法である。

class Hoge {
    constructor(foo: String) { }
    constructor(foo: String, bar: String) { }
}

{}の内容が空の場合は{}は省略することができるが、引数がない場合でも()は省略できない。

また、セカンダリーコンストラクターは別のセカンダリーコンストラクターやプライマリーコンストラクターを、初期化ブロックも含めて呼び出すことができる。この場合は、次のように記述する。

class Hoge(foo: String) {
    init {
        println(foo)
    }

    constructor(foo: String, bar: String): this(foo+bar)
    constructor(foo: Int, bar: Int): this(foo.toString(), bar.toString())
}

fun main() {
    Hoge("hoge")            // constructorは二つとも呼ばれない
    Hoge("hoge", "fuga")    // 一つ目のconstructorが呼ばれる
    Hoge(33, 4)             // 二つ目のconstructorが呼ばれる
}

おさらい

以上をおさらいすると、Kotlinのクラス定義は次のようになっている。

class Hoge constructor(
    // ここがプライマリーコンストラクター
    val fuga: String,
    val piyo: String
) {
    // この部分がクラス本体

    init {
        // ここが初期化ブロック
    }
    constructor(fuga: String) : this(fuga, "ぴよ") // これがセカンダリーコンストラクター
}
用語の所属
予約語 (Kotlin)
コンストラクター
関連する用語
init (Kotlin)

コメントなどを投稿するフォームは、日本語対応時のみ表示されます


KisoDic通信用語の基礎知識検索システム WDIC Explorer Version 7.04a (27-May-2022)
Search System : Copyright © Mirai corporation
Dictionary : Copyright © WDIC Creators club