ケースクラス
不変データの入れ物です。
「ケースクラス」はCoddyKit上の無料Scala for Backend Engineering & Functional Programmingレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはScala for Backend Engineering & Functional Programming学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Scala for Backend Engineering & Functional Programmingコースには全4レッスンが含まれています。
Case classとは
case classは、不変データを保持するために設計された特殊な種類のクラスです。case classを使って宣言します。
Scalaが便利なコードの多くを自動生成してくれるため、case classはデータモデルを定義する標準的な方法です。
case classの宣言
パラメーターリストにフィールドを列挙するだけです。各パラメーターが不変フィールドになります。
インスタンスの作成にnewキーワードは必要ありません。
case class Point(x: Int, y: Int)
object Main {
def main(args: Array[String]): Unit = {
val p = Point(3, 4)
println(p.x)
println(p.y)
}
}自動生成されるtoString
case classには、クラス名とフィールドの値を表示する読みやすいtoStringが自動的に用意されます。
これにより、デバッグやロギングを簡単に行えます。
case class Point(x: Int, y: Int)
object Main {
def main(args: Array[String]): Unit = {
val p = Point(1, 2)
println(p)
}
}値による等価性
case classは参照ではなく値によって比較されます。同じフィールドを持つ2つのインスタンスは等しいと判定されます。
通常のクラスでは、代わりに同一性によって比較されます。
case class Point(x: Int, y: Int)
object Main {
def main(args: Array[String]): Unit = {
val a = Point(1, 2)
val b = Point(1, 2)
println(a == b)
}
}不変フィールド
case classのフィールドはデフォルトでvalなので、再代入できません。
変更したバージョンが必要な場合は、元のインスタンスを変更するのではなく、新しいインスタンスを作成します。
case class Point(x: Int, y: Int)
object Main {
def main(args: Array[String]): Unit = {
val p = Point(1, 2)
println(p.x)
}
}copyメソッド
すべてのcase classにはcopyメソッドがあります。新しいインスタンスを作成し、指定したフィールドだけを変更できます。
これは不変データを更新する標準的な方法です。
case class Point(x: Int, y: Int)
object Main {
def main(args: Array[String]): Unit = {
val p = Point(1, 2)
val moved = p.copy(y = 99)
println(p)
println(moved)
}
}パターンマッチングのサポート
case classはmatchとシームレスに連携します。パターン内でフィールドに名前を付けることで、デコンストラクションできます。
これがcase classを使う大きな理由の1つです。
case class Point(x: Int, y: Int)
object Main {
def describe(p: Point): String = p match {
case Point(0, 0) => "origin"
case Point(x, 0) => s"on x-axis at $x"
case Point(x, y) => s"point ($x, $y)"
}
def main(args: Array[String]): Unit = {
println(describe(Point(0, 0)))
println(describe(Point(5, 0)))
println(describe(Point(2, 3)))
}
}パラメーターのデフォルト値
通常のクラスと同様に、case classのパラメーターにもデフォルト値を指定できるため、インスタンス作成時に省略できます。
case class User(name: String, active: Boolean = true)
object Main {
def main(args: Array[String]): Unit = {
val u1 = User("Ada")
val u2 = User("Bo", false)
println(u1)
println(u2)
}
}メソッドの追加
case classの本体には、通常のクラスと同様に独自のメソッドを定義できます。メソッドは不変フィールドに対して処理を行います。
case class Rect(w: Int, h: Int) {
def area: Int = w * h
}
object Main {
def main(args: Array[String]): Unit = {
val r = Rect(3, 4)
println(r.area)
}
}なぜcase classを使うのか
case classを使うと、次の機能を自動的に利用できます。
- 不変フィールドを持つ簡潔なコンストラクター
- 読みやすい
toString - 値に基づく
equalsとhashCode copyメソッド- 第一級のパターンマッチング
Scalaでデータをモデル化するための基盤となる機能です。
まとめて使う
この例では、case classの作成、コピー、比較、パターンマッチングをまとめて行います。
case class Money(amount: Int, currency: String)
object Main {
def main(args: Array[String]): Unit = {
val price = Money(10, "USD")
val sale = price.copy(amount = 8)
println(price == sale)
sale match {
case Money(a, "USD") => println(s"$a dollars")
case Money(a, c) => println(s"$a $c")
}
}
}理解度チェック
case classについての理解度を確認しましょう。
まとめ
case classは、ヘルパーが自動生成される不変データをモデル化するものだと学びました。
newなしで構築でき、フィールドは不変のvalですtoString、値に基づくequals/hashCodeが自動的に利用できますcopyで変更した複製を作成できます- パターンマッチングが組み込みでサポートされています
- デフォルト値やカスタムメソッドも定義できます
よくある質問
「ケースクラス」レッスンは無料ですか?
はい。「ケースクラス」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Scala for Backend Engineering & Functional Programmingコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Scala for Backend Engineering & Functional Programmingコースには全4レッスンが含まれています。
「ケースクラス」で何を学びますか?
不変データの入れ物です。 ブラウザで直接実行するハンズオンコードでScala for Backend Engineering & Functional Programmingを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Scala for Backend Engineering & Functional Programmingを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのScala for Backend Engineering & Functional Programmingは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。
「ケースクラス」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このScala for Backend Engineering & Functional Programmingレッスンでコードを書いて実行できますか?
はい。すべてのScala for Backend Engineering & Functional Programmingレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。