케이스 오브젝트와 오브젝트의 차이점


226

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


3
그는 요점이 있습니다-패턴 일치를 위해 케이스 객체가 필요하지 않습니다. 나는 이것이 이전 질문에서 다루어지지 않았다고 생각한다.
axel22

3
패턴 일치 동작에 차이가 있다고 생각했지만 패턴 일치 AFAIK에서 사례 개체와 일반 개체가 동일한 방식으로 작동합니다. 케이스 객체에 대한 정보를 찾기가 매우 어렵 기 때문에 우리를 깨우는 누군가를 고대하고 있습니다.
Age Mooij

4
case패턴 일치를 위해 사용할 필요는 없으며 단지 설탕입니다. unapply자신을 구현 하면 작업이 수행됩니다.
Raphael

1
수락 된 답변은 그에 대한 의견에서 논의 된 것처럼 질문에 대답하지 않습니다. 차이를 만들기에는 너무 늦었지만주의해야합니다.
itsbruce

허용 된 답변을 수정하기에는 아직 늦지 않았습니다. 편집 내용을 검토하고 관련되는 경우 수락합니다.
C4stor

답변:


111

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

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

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


46
이 답변의 포인트 3과 4는 사례 개체와 개체의 정확한 차이입니다. 포인트 1과 2는 싱글 톤 오브젝트에는 중요하지 않습니다. 그리고 싱글 톤 객체는 항상 arity가 0 인 제품이므로 포인트 5도 중요하지 않습니다.
Wojciech Durczyński

86
이 포스트 object는 싱글 톤과 같은 신화를 영속시킵니다 . 그렇지 않습니다. 오히려 그것은 그것이 말하는 것, 즉 객체, 즉 하나의 선언과 인스턴스화입니다. object패키지 범위에 정의 된 경우 단일 인스턴스로 제한 되며, 실제로이를 단일 범위로 만들지 만 IN THAT SCOPE에 정의 된 경우에만 가능합니다. 클래스 내부에 정의 된 경우 클래스 자체만큼 인스턴스를 가질 수 있습니다 (지연 적으로 인스턴스화되므로 반드시 1-1 일 필요는 없음). 그리고 이러한 내부 객체는 해시 키로 매우 잘 사용될 수 있으므로 기본 equals / hashCode는 매우 합리적입니다.
nilskp

66
문제는 case object수업 이 아니라는 것입니다. 왜 이것이 정답입니까?
Ixx

10
이것은 질문에 대답하지 않습니다. 이 답변의 차이를 다루는 case class하고 class. 질문의 차이에 관한 것입니다 case objectobject.
MK

6
@ C4stor하지만 대답은 그렇지 않습니다. 객체는 클래스가 아닙니다. 스칼라의 다양한 엣지 케이스와 합병증을 고려할 때 케이스 클래스가 무대 뒤에서 상당한 마법을 가졌다는 점을 감안할 때 표준 스칼라 객체와 케이스 객체의 유일한 차이점이 차이점에 대해 알고 있다고 가정 할 이유가 없습니다. 표준 클래스와 사례 클래스 간. 이 답변은 질문의 문구조차 다루지 않습니다.
itsbruce

137

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

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

toString 차이 :

scala> foo

res2 : foo.type = foo $ @ 7bf0bac8

scala> foocase

res3 : foocase.type = foocase


2

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


0

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


0

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

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.