| ア | イ | ウ | エ | オ |
| カ | キ | ク | ケ | コ |
| サ | シ | ス | セ | ソ |
| タ | チ | ツ | テ | ト |
| ナ | ニ | ヌ | ネ | ノ |
| ハ | ヒ | フ | ヘ | ホ |
| マ | ミ | ム | メ | モ |
| ヤ | ユ | ヨ | ||
| ラ | リ | ル | レ | ロ |
| ワ | ヰ | ヴ | ヱ | ヲ |
| ン |
| 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, "ぴよ") // これがセカンダリーコンストラクター
}
コメントなどを投稿するフォームは、日本語対応時のみ表示されます