【正社員】還元率83%【フリーランス】マージン一律5万円で案件をご紹介させていただきます。 詳細はこちら

【Android】<Kotlin>コンストラクタの使い方を完全マスター!基本構文から実践活用まで徹底解説

【Android】<Kotlin>コンストラクタの使い方を完全マスター!基本構文から実践活用まで徹底解説
すだ

みなさまこんにちは〜!
メモリアインクのすだです。

オブジェクト指向言語におけるコンストラクタは共通概念ですが、
Kotlinでも同様に使いこなせるよう 今回は基本からしっかり解説していきます!

この記事を読んでわかること…
・コンストラクタとは?
・Kotlinにおけるコンストラクタの種類
・Kotlinにおけるコンストラクタの使い方

目次

環境

  • Kotlin (ver 1.9.0)
  • Android Studio (Giraffe | 2022.3.1 Patch 3)

コンストラクタとは?

コンストラクタ(constructor)とは、
クラスのインスタンス(オブジェクト)を作るときに、最初に1度だけ自動で呼ばれる「初期化関数」のことです。
(= 勝手に呼び出されてくれる処理のこと)

Kotlinには主に以下の2つのコンストラクタがあります。

種類説明
主コンストラクタ(primary constructor)クラス定義と一緒に書く、メインのコンストラクタ
補助コンストラクタ(secondary constructor)条件によって追加の初期処理を行いたいときに使う

Kotlinにおけるコンストラクタの書き方

Kotlinでは正確には以下のように書きますが、

class User constructor(val name: String, val age: Int)

“constructor”は省略可能ですので、以下のように書いてください。▼

class User(val name: String, val age: Int)

Kotlinでは
class User(val name: String, val age: Int)
のようにクラスを定義すること自体が、コンストラクタ(正確には主コンストラクタ)を定義していることになります。

val user = User("さくら", 25)

println(user.name)  // → さくら
println(user.age)   // → 25

このようにインスタンスを生成する際、name や age の値を渡すだけで、
Userクラスのプロパティに自動的に値がセットされます
Kotlinでは、val や var を使って主コンストラクタに書いた引数が、そのままクラスのプロパティ(= クラスのデータ)として扱われるためです。

init ブロックとは?

init ブロックとは、クラスのインスタンス(オブジェクト)を作ったときに、最初に一度だけ自動で実行される処理をまとめて書く場所です。

Kotlinでは、主コンストラクタに中身(処理)を書くことができないので、
その代わりに init ブロックが用意されています。

使い方

class User(val name: String) {
    init {
        println("こんにちは、$name さん!")  // インスタンス生成時に実行される
    }
}

val user = User("さくら")

実行結果 ▼

こんにちは、さくら さん!

このように コンストラクタの引数には書けない具体的な処理を
initブロックを使って書くことができます。

例えば、クラスのインスタンス生成時に 値をチェックしたい場合、

class Product(val name: String, val price: Int) {
    init {
        if (price < 0) {
            println("⚠ 警告:価格がマイナスです($price 円)")
        }
    }
}

val p = Product("みかん", -300)
// → 警告:価格がマイナスです(-300 円)

このように書けば、初期化のタイミングで不正な値に対して注意を促すことができる階で条件に沿わない値を弾くことができます。

また、複数書くことも可能です。この場合、上から順番に処理が走っていきます。

class Example {
    init {
        println("最初の処理")
    }

    init {
        println("2つ目の処理")
    }
}

補助(secondary)コンストラクタとは?

secondary constructor(補助コンストラクタ)は、
主コンストラクタだけでは対応しきれない複数の初期化パターンを用意したいときに役立ちます。

使い方

class User {
    var name: String
    var age: Int

    // 1つ目のコンストラクタ
    constructor(name: String) {
        this.name = name
        this.age = 0  // デフォルト値
    }

    // 2つ目のコンストラクタ
    constructor(name: String, age: Int) {
        this.name = name
        this.age = age
    }
}

// 呼び出し時
val user1 = User("さくら")
val user2 = User("たろう", 25)

このようにconstructorと書いて中身の処理を定義します。
呼び出し時は、定義した補助コンストラクタの引数に合わせて値の方や数を変えることで、
内容に沿った補助コンストラクタの処理が走るというわけです。

注意点とよくあるエラー

もしすでに主コンストラクタが存在する場合は、this(…)を使って主コンストラクタを呼び出す記述が必須となります。
つまりは、主コンストラクタでやるべき初期化を、補助コンストラクタからも再利用してるということになります。
(コードの重複を避けるための “橋渡し”記法)

注意点として、: this(…)で主コンストラクタを呼び出さないと、コンパイルエラー になります。
(これは Kotlin の明確な文法ルールで、「初期化経路を一本化するため」にそうなっています)

// 主コンストラクタ
class Account(val username: String, val password: String) {

    // パスワードが省略されたとき用の補助コンストラクタ
    constructor(username: String) : this(username, "1234") {
        println("パスワードが未入力だったので「1234」が自動的に設定されました")
    }

    fun show() {
        println("ユーザー名: $username / パスワード: $password")
    }
}

fun main() {
    val account1 = Account("sakura", "abcd")
    val account2 = Account("taro") // ← 補助コンストラクタが呼ばれる

    account1.show()
    account2.show()
}

実行結果 ▼

ユーザー名: sakura / パスワード: abcd

パスワードが未入力だったので「1234」が自動的に設定されました
ユーザー名: taro / パスワード: 1234

Kotlin開発における実践例

ViewModelでの依存性注入

class MyViewModel(private val repository: UserRepository) : ViewModel() {
    fun getUser() {
        val user = repository.getUser()
        // ロジック処理
    }
}

HiltやKoinなどのDI(依存性注入)フレームワークと組み合わせることで、コンストラクタで受け取ったクラスをテストしやすく、安全に管理できます。

データモデルの初期化

data class Product(
    val id: String,     // 商品ID
    val name: String,   // 商品名
    val price: Int      // 価格(円)
)

data class と 主コンストラクタ を組み合わせることで、モデルデータがより簡潔になります。

data class は「データをまとめるだけのクラス」を簡単に書ける便利な仕組みです。
Product クラスは、商品1件の情報(id・名前・価格)を1つのまとまりとして扱うために使われます。

まとめ

おつかれさまでした。いかがでしたでしょうか!

処理が重複して煩雑になりがちな方は、ぜひ一度、その設計がコンストラクタの活用に適しているかどうかを見直して
必要に応じて取り入れてみてください。
コンストラクタをうまく使うことで、コードの重複を防ぎ、初期化処理をスッキリ整理することができます。

すだ

技術者としてのキャリアパスを次のレベルへと進めたい皆様、
未経験からIT・Webエンジニアを目指すなら【ユニゾンキャリア】
を通じて、
自分の市場価値をさらに向上させてみませんか?

それではまた次回の記事でお会いしましょう!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

弊社テックブログをご愛読いただきありがとうございます。
当テックブログを運用している株式会社メモリアインクは、
【正社員】還元率83%
【フリーランス】マージン一律5万円で案件のご紹介
と、エンジニアの皆様に分かりやすい形で稼げる仕組みを構築し提供させていただいております。

コメント

コメントする

目次