스칼라에서 케이스 객체와 객체 사이에 차이점이 있습니까?
case
패턴 일치를 위해 사용할 필요는 없으며 단지 설탕입니다. unapply
자신을 구현 하면 작업이 수행됩니다.
스칼라에서 케이스 객체와 객체 사이에 차이점이 있습니까?
case
패턴 일치를 위해 사용할 필요는 없으며 단지 설탕입니다. unapply
자신을 구현 하면 작업이 수행됩니다.
답변:
사례 클래스는 다음과 같은 점에서 일반 클래스와 다릅니다.
equals
and의 기본 구현hashCode
toString
하고,scala.Product
. 패턴 일치, equals 및 hashCode는 싱글 톤의 경우 중요하지 않으므로 (실제로 성능이 저하되지 않는 한) 직렬화, nice toString
및 아마도 사용하지 않을 방법이 거의 있습니다.
object
는 싱글 톤과 같은 신화를 영속시킵니다 . 그렇지 않습니다. 오히려 그것은 그것이 말하는 것, 즉 객체, 즉 하나의 선언과 인스턴스화입니다. object
패키지 범위에 정의 된 경우 단일 인스턴스로 제한 되며, 실제로이를 단일 범위로 만들지 만 IN THAT SCOPE에 정의 된 경우에만 가능합니다. 클래스 내부에 정의 된 경우 클래스 자체만큼 인스턴스를 가질 수 있습니다 (지연 적으로 인스턴스화되므로 반드시 1-1 일 필요는 없음). 그리고 이러한 내부 객체는 해시 키로 매우 잘 사용될 수 있으므로 기본 equals / hashCode는 매우 합리적입니다.
case object
수업 이 아니라는 것입니다. 왜 이것이 정답입니까?
case class
하고 class
. 질문의 차이에 관한 것입니다 case object
및 object
.
한 가지 차이점이 있습니다. 케이스 객체는 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 : 직렬화 가능 = foocase
toString 차이 :
scala> foo
res2 : foo.type = foo $ @ 7bf0bac8
scala> foocase
res3 : foocase.type = foocase
case 객체는 암시 적으로 toString, equals 및 hashCode 메소드 구현과 함께 제공되지만 간단한 객체는 그렇지 않습니다. 간단한 객체는 불가능하지만 case 객체는 직렬화 될 수있어 Akka-Remote의 메시지로 매우 유용합니다. object 키워드 앞에 case 키워드를 추가하면 객체를 직렬화 할 수 있습니다.