ケースオブジェクトとオブジェクトの違い


226

ケースオブジェクトとscalaのオブジェクトに違いはありますか?


3
彼はポイントを持っています-それにパターンマッチングを行うことができるようにするためにケースオブジェクトを持つ必要はありません。これは前の質問では対処されていなかったと思います...
axel22

3
パターンマッチングの動作に違いがあると思いましたが、パターンマッチAFAIKでは、ケースオブジェクトと通常のオブジェクトの両方が同じように動作します。ケースオブジェクトに関する情報を見つけるのは非常に難しいので、私たちを啓発する人をお待ちしています。
Mooij年齢

4
caseパターンマッチングを使用する必要はありません。それは砂糖です。unapply自分で実装することが仕事です。
ラファエル

1
コメントで説明されているように、受け入れられた回答は質問に答えません。違いを生み出すには遅すぎますが、注意する必要があります。
itsbruce 2017年

承認された回答を編集するのに遅すぎることはありません。編集内容はレビューされ、必要に応じて承認されます。
C4stor 2017年

回答:


111

Caseクラスは、通常のクラスとは異なります。

  1. パターンマッチングサポート
  2. equalsおよびのデフォルトの実装hashCode
  3. シリアライゼーションのデフォルト実装
  4. のよりきれいなデフォルト実装toString、および
  5. から自動的に継承して得られる少量の機能scala.Product

シングルトンの場合、パターンマッチング、イコール、ハッシュコードはそれほど重要ではないので(本当に縮退したことを行わない限り)、シリアル化、素晴らしいtoString、そしておそらく使用しないメソッドを取得するだけです。


46
この回答のポイント3と4は、ケースオブジェクトとオブジェクトの正しい違いです。ポイント1と2は、シングルトンオブジェクトには関係ありません。また、シングルトンオブジェクトは常にアリティ0の製品であるため、ポイント5も関係ありません。
WojciechDurczyński

86
この投稿objectは、シングルトンと同じであるという神話を永続させます。そうではない。むしろ、それはまさにそれが言うことである、オブジェクト、すなわち1つの中での宣言とインスタンス化です。これobjectは、パッケージスコープで定義されている場合、単一のインスタンスに制限されます。これにより、実質的にシングルトンになりますが、その範囲内で定義されている場合のみです。クラス内で定義した場合、クラス自体と同じ数のインスタンスを持つことができます(遅延してインスタンス化されるため、必ずしも1-1とは限りません)。そして、それらの内部オブジェクトはハッシュキーとして非常によく使用され、デフォルトのequals / hashCodeを非常に賢明にします。
nilskp 2013年

66
質問はcase objectクラスではありませんが、なぜこれが正しい答えですか?
Ixx 2015年

10
これは質問の答えにはなりません。この答えは、違いを扱うcase classclass。質問は違いについてですcase objectobject
MK

6
@ C4storしかし、答えはそれを言っていません。オブジェクトはクラスではありません。Scalaのさまざまなエッジケースと複雑さを考えると、ケースクラスが舞台裏でかなりの魔法をかけていることを考えると、標準のScalaオブジェクトとケースオブジェクトの唯一の違いが違いについてわかっていることによって説明されると単純に仮定する理由はありません標準クラスとケースクラスの間。この回答は質問の文言についても触れていません。
itsbruce 2017年

137

ここに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$

15
ケースオブジェクトをシリアル化できるのは通常のオブジェクトとの最も大きな違いだと思います。特に俳優間のネットワーク通信はそうです
爱国者

14
追加extends Serializableでも同じトリックを実行する必要があります。
nilskp 2013年

36
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


2

ケースオブジェクトは暗黙的にメソッドtoString、equals、およびhashCodeの実装に付属していますが、単純なオブジェクトには付属していません。ケースオブジェクトはシリアル化できますが、シンプルオブジェクトはシリアル化できません。そのため、ケースオブジェクトはAkka-Remoteのメッセージとして非常に役立ちます。オブジェクトキーワードの前にケースキーワードを追加すると、オブジェクトがシリアライズ可能になります。


0

これはcase classandと似ていますが、追加の状態情報を表すフィールドがない場合の代わりにclass使用します。case objectcase class


0

以前、オブジェクトと「ケースクラス」を知っています。ただし、「ケースオブジェクト」は両方の組み合わせです。つまり、オブジェクトに似たシングルトンであり、ケースクラスのように多くのボイラープレートがあります。唯一の違いは、ボイラープレートがクラスではなくオブジェクトに対して実行されることです。

ケースオブジェクトには以下のものは付属していません:

メソッドを適用、適用解除します。これはシングルトンなので、ここにはコピー方法はありません。構造的同等性を比較する方法はありません。コンストラクタもありません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.