Menu
Coddy logo textTech

プライマリコンストラクタ

CoddyのKotlinジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 3/57。

ほとんどの Kotlin クラスは、クラス名の後の括弧内に記述するプライマリコンストラクターで初期値を受け取ります。パラメーターの前に val または var を付けると、同時にプロパティになります。

class Book(val title: String, var pages: Int)

main の内部では次のようにします。

val book = Book("Dune", 412)
println(book.title)
book.pages += 8
println(book.pages)

出力:

Dune
420

val または var のないパラメーターは、プロパティの計算など、インスタンスの作成中にのみ使用できます。val プロパティは作成後に再代入できませんが、var プロパティは再代入できます:

class Temperature(celsius: Double) {
    val fahrenheit = celsius * 9 / 5 + 32
}

main の内部:

val t = Temperature(100.0)
println(t.fahrenheit)

出力:

212.0

コンストラクターのパラメーターにはデフォルト値を設定でき、名前を指定して渡すこともできるため、1つのコンストラクターでインスタンスを作成するさまざまな方法に対応できます:

class Timer(val seconds: Int, val label: String = "timer")

mainの中で:

val egg = Timer(300, "egg")
val quick = Timer(30)
val named = Timer(label = "tea", seconds = 180)
println("${egg.label} ${egg.seconds}")
println("${quick.label} ${quick.seconds}")
println("${named.label} ${named.seconds}")

出力:

egg 300
timer 30
tea 180

クラス本体内では、thisは現在のインスタンスを指します。メソッドのパラメーターがプロパティと同じ名前を持つ場合に必要です。

class Player(var name: String) {
    fun rename(name: String) {
        this.name = name
    }
}

main内では:

val p = Player("anon")
p.rename("Ada")
println(p.name)

出力:

Ada
challenge icon

チャレンジ

簡単

プライマリコンストラクターを持つクラス Account を宣言します。読み取り専用の owner と、デフォルト値が 0 の変更可能な balance を指定してください。Ada has 150 を返す summary() を追加します。

用意されたコードは所有者を読み取り、2 行目が存在する場合は開始残高も読み取ります。残高の有無に応じてアカウントを作成し、summary() を出力します。

コードは Account.kt に記述してください。Main.kt には用意された入力/出力コードが含まれており、編集できません。

自分で試してみよう

fun main() {
    // 提供された入出力コード: そのままにしておく
    val input = generateSequence(::readLine).toList()
    val account = if (input.size > 1) Account(input[0], input[1].toInt()) else Account(input[0])
    println(account.summary())
}
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

オブジェクト指向プログラミングのすべてのレッスン

自分で練習してみよう: Kotlinプレイグラウンド