constructor (Kotlin) |
辞書:電算用語の基礎知識 プログラミング仕様編 (PTPROGS) |
読み:こんすとらくたー |
外語:constructor |
品詞:名詞 |
|
概要 |
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, "ぴよ") // これがセカンダリーコンストラクター }
リンク |
通信用語の基礎知識検索システム WDIC Explorer Ver 7.04a (27-May-2022) Search System : Copyright © Mirai corporation Dictionary : Copyright © WDIC Creators club |