パターン マッチングは最も重要ですが、ケース クラスの唯一のアプリケーションではありません。もう 1 つの重要な点は、コンストラクターの引数 (別名 product 要素) に関してメソッドequals
とメソッドを実装することです。hashCode
したがって、ケース クラスは、セット内の要素またはマップ内のキーとして機能するデータ構造を定義するのに非常に役立ちます。これは、これらの要素が表示されている場合にのみ意味があります。
比較:
class Foo(val i: Int)
val set1 = Set(new Foo(33))
set1.contains(new Foo(33)) // false!!
と:
case class Bar(val i: Int)
val set2 = Set(Bar(33)
set2.contains(Bar(33)) // true!
パラメータが等しい 2 つのケース クラス インスタンスは、それ自体が等しい。それらがいくつかの「定数」を表していると想像できます。これは、変更可能な状態を保持してはならないことを意味します。
ただし、2 番目のパラメーター リストを使用して、等式から引数を除外することができます。
case class Baz(i: Int)(val n: Long)
Baz(33)(5L) == Baz(33)(6L) // true!
コンストラクターの引数が値になることを意味するもう 1 つの便利な機能は、コピーの作成です。これが不変データの変更方法です。特定の値を変更して新しいインスタンスを作成し、元の値はそのままにします。
case class Person(name: String, age: Int)
val p1 = Person("Fuzzi", 33)
val p2 = p1.copy(age = 34)
copy メソッドは、指定されていないすべての引数にデフォルト値を使用し、それらの値をコンストラクター引数から取得します。