1. ホーム
  2. スカラ

[解決済み】ScalaのCaseオブジェクトとEnumerationsの比較

2022-04-02 11:14:42

質問

を使用する際のベストプラクティスのガイドラインはありますか? ケースクラス (またはケースオブジェクト)とEnumerationを拡張することの違いについて教えてください。

同じような利点があるようです。

どのように解決するのか?

大きな違いは Enumeration をインスタンス化するためのサポートが付属しています。 name 文字列です。例えば

object Currency extends Enumeration {
   val GBP = Value("GBP")
   val EUR = Value("EUR") //etc.
} 

それなら、できるはずです。

val ccy = Currency.withName("EUR")

これは、列挙をデータベースなどに永続化したい場合や、ファイルにあるデータから列挙を作成したい場合に便利です。しかし、一般的にScalaでは列挙は少し不器用で、厄介なアドオンのような感じがします。 case object s. A case object は enum よりも柔軟です。

sealed trait Currency { def name: String }
case object EUR extends Currency { val name = "EUR" } //etc.

case class UnknownCurrency(name: String) extends Currency

それで、今、私が持っている利点は...

trade.ccy match {
  case EUR                   =>
  case UnknownCurrency(code) =>
}

として カオス3平衡 のご指摘をいただきました(読みやすくするために一部修正しました)。

UnknownCurrency(code)" パターンについて、通貨コード文字列が見つからない場合、quot;break" の閉集合の性質以外に対処する方法があります。 Currency 型を使用します。 UnknownCurrency しょくしゅせい Currency がAPIの他の部分に忍び込むことができるようになった。

このような場合は Enumeration を処理させ、クライアントは Option[Currency] のようなタイプは、マッチングに問題があることを明確に示し、APIの利用者が自分で解決することを奨励します。

ここでの他の回答のフォローアップになりますが、主な欠点は case object よりも Enumeration sは

  1. enumeration" のすべてのインスタンスに対して反復処理できません。 . 確かにそうなのですが、実際にはこれが必要なケースは極めて稀だと思います。

  2. 永続化された値から簡単にインスタンス化できない . これも事実ですが、巨大な列挙(たとえば、すべての通貨)の場合を除けば、大きなオーバーヘッドをもたらすものではありません。