[scala] 케이스 오브젝트와 오브젝트의 차이점

스칼라에서 케이스 객체와 객체 사이에 차이점이 있습니까?



답변

사례 클래스는 다음과 같은 점에서 일반 클래스와 다릅니다.

  1. 패턴 매칭 지원
  2. equalsand의 기본 구현hashCode
  3. 직렬화의 기본 구현
  4. 의 예쁜 기본 구현 toString하고,
  5. 자동 상속에서 얻는 소량의 기능 scala.Product.

패턴 일치, equals 및 hashCode는 싱글 톤의 경우 중요하지 않으므로 (실제로 성능이 저하되지 않는 한) 직렬화, nice toString및 아마도 사용하지 않을 방법이 거의 있습니다.


답변

한 가지 차이점이 있습니다. 케이스 객체는 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$


답변

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 : 직렬화 가능 = foocase

toString 차이 :

scala> foo

res2 : foo.type = foo $ @ 7bf0bac8

scala> foocase

res3 : foocase.type = foocase


답변

case 객체는 암시 적으로 toString, equals 및 hashCode 메소드 구현과 함께 제공되지만 간단한 객체는 그렇지 않습니다. 간단한 객체는 불가능하지만 case 객체는 직렬화 될 수있어 Akka-Remote의 메시지로 매우 유용합니다. object 키워드 앞에 case 키워드를 추가하면 객체를 직렬화 할 수 있습니다.


답변

그것은과 비슷 case class하고 class우리는 단지 사용 case object하는 대신 case class추가 상태 정보를 나타내는 모든 필드가없는 경우.


답변

우리는 전에 객체와 “케이스 클래스”를 알고 있습니다. 그러나 “케이스 개체”는 두 가지가 혼합되어 있습니다. 즉, 개체와 비슷한 싱글 톤이며 케이스 클래스와 같이 많은 상용구가 있습니다. 유일한 차이점은 보일러 플레이트가 클래스 대신 객체에 대해 수행된다는 것입니다.

case 객체에는 다음과 함께 제공되지 않습니다.

적용, 미적용 방법. 이것은 싱글 톤이므로 복사 방법이 없습니다. 구조적 평등 비교 방법이 없습니다. 생성자도 없습니다.


답변