class / コンストラクター
| 対応: | Kotlin 1.0(2016) |
|---|
Kotlinのクラスは『class』キーワードで定義します。プライマリコンストラクターはクラスヘッダーに直接書け、初期化処理は『init』ブロックに記述します。セカンダリコンストラクターは『constructor』キーワードを使います。
構文
// プライマリコンストラクター(最も一般的な形式)
class Person(val name: String, var age: Int)
// init ブロックで初期化処理を記述
class User(val name: String, val age: Int) {
init {
require(age >= 0) { "年齢は0以上である必要があります" }
}
}
// セカンダリコンストラクター(constructor キーワード)
class Point {
val x: Double
val y: Double
constructor(x: Double, y: Double) {
this.x = x
this.y = y
}
constructor(value: Double) : this(value, value) // 委譲
}
構文一覧
| 構文 | 概要 |
|---|---|
| class クラス名(val x: 型) | プロパティを持つプライマリコンストラクターです。 |
| init { } | インスタンス生成時に実行される初期化ブロックです。 |
| constructor(引数) { } | セカンダリコンストラクターの定義です。 |
| : this(引数) | 別のコンストラクターに委譲します。 |
| private constructor | コンストラクターをプライベートにします(ファクトリーパターン等)。 |
サンプルコード
sample_class_constructor.kt
// プライマリコンストラクターとプロパティ定義
class Person(
val name: String,
var age: Int,
val email: String = "" // デフォルト引数
) {
// init ブロックはコンストラクター実行後に呼ばれる
init {
require(name.isNotBlank()) { "名前は空にできません" }
require(age >= 0) { "年齢は0以上である必要があります" }
println("Person インスタンス生成: $name (${age}歳)")
}
// プロパティの計算
val greeting: String
get() = "こんにちは、${name}です!"
}
// セカンダリコンストラクターの例
class Rectangle(val width: Double, val height: Double) {
val area: Double = width * height
// 正方形用のセカンダリコンストラクター
constructor(side: Double) : this(side, side)
}
// private コンストラクター(ファクトリーパターン)
class Database private constructor(val url: String) {
companion object {
fun create(url: String): Database {
println("データベース接続: $url")
return Database(url)
}
}
}
fun main() {
// プライマリコンストラクターでインスタンス生成
val iori = Person("八神庵", 20, "iori@example.com")
println(iori.greeting)
// デフォルト引数を使う
val kyo = Person("草薙京", 20)
println("草薙京 のメール: '${kyo.email}'") // 空文字
// 名前付き引数でコンストラクターを呼び出す
val terry = Person(name = "テリー・ボガード", age = 24)
println("テリー・ボガード の年齢: ${terry.age}")
// セカンダリコンストラクター
val rect = Rectangle(4.0, 3.0)
val square = Rectangle(5.0) // 正方形
println("長方形の面積: ${rect.area}") // 12.0
println("正方形の面積: ${square.area}") // 25.0
// ファクトリーパターン
val db = Database.create("jdbc:mysql://localhost/mydb")
println("接続先: ${db.url}")
// init での検証(不正な引数は例外になります)
try {
Person("", 25)
} catch (e: IllegalArgumentException) {
println("エラー: ${e.message}")
}
}
class_constructor.kt
kotlinc class_constructor.kt -include-runtime -d class_constructor.jar java -jar class_constructor.jar Person インスタンス生成: 八神庵 (20歳) こんにちは、八神庵です! Person インスタンス生成: 草薙京 (20歳) 草薙京 のメール: '' Person インスタンス生成: テリー・ボガード (24歳) テリー・ボガード の年齢: 24 長方形の面積: 12.0 正方形の面積: 25.0 データベース接続: jdbc:mysql://localhost/mydb 接続先: jdbc:mysql://localhost/mydb エラー: 名前は空にできません
概要
Kotlinのクラスは、Javaと比べてコンストラクターの記述が大幅に簡潔です。プライマリコンストラクターにプロパティを直接定義できるため、Javaで必要だったフィールド宣言・コンストラクター本体・代入処理が1行に収まります。
複数の『init』ブロックを書くことも可能で、上から順に実行されます。セカンダリコンストラクターは必ずプライマリコンストラクターに委譲(『: this(...)』)する必要があります。
データ保持に特化したクラスはdata classを、継承・オーバーライドはopen / overrideを参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。