ア | イ | ウ | エ | オ |
カ | キ | ク | ケ | コ |
サ | シ | ス | セ | ソ |
タ | チ | ツ | テ | ト |
ナ | ニ | ヌ | ネ | ノ |
ハ | ヒ | フ | ヘ | ホ |
マ | ミ | ム | メ | モ |
ヤ | ユ | ヨ | ||
ラ | リ | ル | レ | ロ |
ワ | ヰ | ヴ | ヱ | ヲ |
ン |
A | B | C | D | E |
F | G | H | I | J |
K | L | M | N | O |
P | Q | R | S | T |
U | V | W | X | Y |
Z | 数字 | 記号 |
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, "ぴよ") // これがセカンダリーコンストラクター }
コメントなどを投稿するフォームは、日本語対応時のみ表示されます