Javaと異なり、Scalaではコンストラクタとクラス定義が一体化されている
class Person(name: String, age: Int) {
def greet(): String = s"Hi, my name is $name and I am $age years old."
}
Person
name
とage
greet()
インスタンス生成と呼び出し
val p = new Person("Alice", 30)
println(p.greet())
外からコンストラクタの引数にアクセスしたい場合、以下のようにすることで自動的にゲッターが生成される
class Person(val name: String, val kind: String)
参照:サンプルコード
case class User(id: Int, name: String)
case class
を定義すると、以下のメソッドが自動生成される
apply
:new
を省略してインスタンス生成unapply
:パターンマッチングで値を取り出すtoString
:オブジェクトの文字列表現equals
:オブジェクトの内容が等しいか判定hashCode
:equals
とセットで使えるハッシュ値copy
:一部フィールドだけを変更した新しいインスタンスを作れるval
扱いになる(外部から読み取り可能に)new
を省略してインスタンスを生成できるclass
ではデフォルトでは難解(オーバーライドすればよい)case class
では自動でわかりやすく生成される(例:Class(str=Hoge)
)case class User(name: String, age: Int)
val u = User("Alice", 20)
println(u.toString) // → User(Alice,20)
case class
は構造比較User("Alice", 20) == User("Alice", 20) // → true
equals
が等しいならばhashCode
も等しくなるMap
のキーやSet
の要素に使う場合、重要val u = User("Alice", 20)
println(u.hashCode)
case class
専用val
が不変でも、copyで手軽に新しいバージョンが作れるval u1 = User("Alice", 20)
val u2 = u1.copy(age = 30) // nameはそのまま、ageだけ変更
参照:サンプルコード
class
と異なり、new
でインスタンス化する必要がないstatic
のように、「どこからでも呼べる便利な機能」をまとめるのに使う参照:サンプルコード
class
とobject
が同じ名前で同じファイルにある場合、そのobject
をコンパニオンオブジェクトというclass
にapply
メソッドなどを追加したり、case class
で自動生成されるメソッドをカスタマイズしたりできるclass
:インスタンスを作る設計図object
:クラスに関連する便利なメソッド・定数をまとめる場所参照:サンプルコード
new
を省略してインスタンスを生成できるcase class User(id: Int, name: String
を定義した時、以下のようなapply
メソッドが自動生成されている
def apply(name: String): User = new User(id, name)
user = User(1, "John")
のように呼び出した時、実際にはUser.apply
が呼び出されているcase class User(id: Int, name: String
を定義した時、以下のようなunapply
メソッドが自動生成されている
def unapply(user: User): Option[(Int, String)] = Some((user.id, user.name))
case User(i, n)
のようにパターンマッチングを行う時、実際にはUser.unapply
が呼び出されているUser(i, n)
のi, nに値が展開される参照:サンプルコード