Caution
お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。
class / コンストラクター
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 | コンストラクターをプライベートにします(ファクトリーパターン等)。 |
サンプルコード
// プライマリコンストラクターとプロパティ定義
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 alice = Person("Alice", 30, "alice@example.com")
println(alice.greeting)
// デフォルト引数を使います。
val bob = Person("Bob", 25)
println("Bob のメール: '${bob.email}'") // 空文字
// 名前付き引数でコンストラクターを呼び出します。
val carol = Person(name = "Carol", age = 28)
println("Carol の年齢: ${carol.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}")
}
}
概要
Kotlinのクラスは、Javaと比べてコンストラクターの記述が大幅に簡潔です。プライマリコンストラクターにプロパティを直接定義できるため、Javaで必要だったフィールド宣言・コンストラクター本体・代入処理が1行に収まります。
複数の『init』ブロックを書くことも可能で、上から順に実行されます。セカンダリコンストラクターは必ずプライマリコンストラクターに委譲(『: this(...)』)する必要があります。
データ保持に特化したクラスはdata classを、継承・オーバーライドはopen / overrideを参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。