下記の特性を踏まえた上で質問を2つさせてください。
class と case class を比べたときに次のような特性があります
-
new
を書かなくても良い
scala> case class Foo()
defined class Foo
scala> class NoneCaseFoo()
defined class NoneCaseFoo
scala> Foo()
res0: Foo = Foo()
scala> new Foo()
res1: Foo = Foo()
scala> NoneCaseFoo()
<console>:8: error: not found: value NoneCaseFoo
NoneCaseFoo()
- case class は
equals
メソッドを自動で実装してくれる
scala> case class Card(value:Int)
defined class Card
scala> class NoneCaseCard(value: Int)
defined class NoneCaseCard
scala> val card1 = new NoneCaseCard(3)
card1: NoneCaseCard = NoneCaseCard@58a0ee03
scala> val card2 = new NoneCaseCard(3)
card2: NoneCaseCard = NoneCaseCard@7e19c472
scala> card1 == card2
res2: Boolean = false
scala> Card(3) == Card(3)
res3: Boolean = true
-
match
キーワードで型+値のパターンマッチができる
scala> def name(card:Card) = card match {
| case Card(1) => "Alice"
| case Card(2) => "Bob"
| case Card(3) => "Carol"
| case Card(x:Int) => x.toString()
| }
name: (card: Card)String
scala> name(Card(3))
res4: String = Carol
-
toString
を自動で実装してくれる
scala> println(Card(3))
Card(3)
- ゲッターを自動で実装してくれる
scala> Card(3).value
res6: Int = 3
- copyを自動で実装してくれる
scala> case class Product(name:String, price:Int)
defined class Product
scala> val product = Product("Bear", 200)
product: Product = Product(Bear,200)
scala> val productForSale = product.copy(price = 150)
productForSale: Product = Product(Bear,150)
Q1: case class はグッドパーツですか?
私はPHPくらいしか知らないので、case classに馴染みがありません。case classは便利な点が多そうですが、classと同じように使っても問題ないのでしょうか? バッドパーツではないですよね?
Q2: 全部 case class で書くべき?
case class は new
を書かなくてよかったりと、普通の classより便利なのですが、全部 case class で書いたほうがいいのでしょうか? それとも、適材適所なのでしょうか? 使い分けがあれば教えて下さい。