LoginSignup
26
29

More than 5 years have passed since last update.

【質問】Scalaのcase classはグッドパーツですか?

Posted at

下記の特性を踏まえた上で質問を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 で書いたほうがいいのでしょうか? それとも、適材適所なのでしょうか? 使い分けがあれば教えて下さい。

26
29
6

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
26
29