ケースオブジェクトとscalaのオブジェクトに違いはありますか?
case
パターンマッチングを使用する必要はありません。それは砂糖です。unapply
自分で実装することが仕事です。
ケースオブジェクトとscalaのオブジェクトに違いはありますか?
case
パターンマッチングを使用する必要はありません。それは砂糖です。unapply
自分で実装することが仕事です。
回答:
Caseクラスは、通常のクラスとは異なります。
equals
およびのデフォルトの実装hashCode
toString
、およびscala.Product
。 シングルトンの場合、パターンマッチング、イコール、ハッシュコードはそれほど重要ではないので(本当に縮退したことを行わない限り)、シリアル化、素晴らしいtoString
、そしておそらく使用しないメソッドを取得するだけです。
object
は、シングルトンと同じであるという神話を永続させます。そうではない。むしろ、それはまさにそれが言うことである、オブジェクト、すなわち1つの中での宣言とインスタンス化です。これobject
は、パッケージスコープで定義されている場合、単一のインスタンスに制限されます。これにより、実質的にシングルトンになりますが、その範囲内で定義されている場合のみです。クラス内で定義した場合、クラス自体と同じ数のインスタンスを持つことができます(遅延してインスタンス化されるため、必ずしも1-1とは限りません)。そして、それらの内部オブジェクトはハッシュキーとして非常によく使用され、デフォルトのequals / hashCodeを非常に賢明にします。
case object
クラスではありませんが、なぜこれが正しい答えですか?
case class
とclass
。質問は違いについてですcase object
とobject
。
ここに1つの違いSerializable
があります。ケースオブジェクトは特性を拡張するため、シリアル化できます。通常のオブジェクトはデフォルトではできません:
scala> object A
defined module A
scala> case object B
defined module B
scala> import java.io._
import java.io._
scala> val bos = new ByteArrayOutputStream
bos: java.io.ByteArrayOutputStream =
scala> val oos = new ObjectOutputStream(bos)
oos: java.io.ObjectOutputStream = java.io.ObjectOutputStream@e7da60
scala> oos.writeObject(B)
scala> oos.writeObject(A)
java.io.NotSerializableException: A$
extends Serializable
でも同じトリックを実行する必要があります。
scala> object foo
定義されたオブジェクトfoo
scala> case object foocase
定義されたオブジェクトfoocase
シリアル化の違い:
scala> foo.asInstanceOf[Serializable]
java.lang.ClassCastException:foo $をscala.Serializableにキャストできません
... 43省略
scala> foocase.asInstanceOf[Serializable]
res1:Serializable = foocase
toStringの違い:
scala> foo
res2:foo.type = foo $ @ 7bf0bac8
scala> foocase
res3:foocase.type = foocase
ケースオブジェクトは暗黙的にメソッドtoString、equals、およびhashCodeの実装に付属していますが、単純なオブジェクトには付属していません。ケースオブジェクトはシリアル化できますが、シンプルオブジェクトはシリアル化できません。そのため、ケースオブジェクトはAkka-Remoteのメッセージとして非常に役立ちます。オブジェクトキーワードの前にケースキーワードを追加すると、オブジェクトがシリアライズ可能になります。