첫 번째는 바이트 코드가 생성 된 추가 메서드로 인해 더 큽니다.
사례 클래스는 첫 번째 매개 변수 목록의 매개 변수를 val
구성원으로 유지합니다. 객체를 생성하는 동안 이외의 매개 변수에 액세스 할 필요가 없다면 이것은 낭비입니다.
스칼라 2.8부터 케이스 클래스는 copy
메서드를 지원하기 위해 후속 매개 변수 섹션의 매개 변수도 유지합니다. 이것은 구현 세부 사항이며 subject to change입니다.
scala> case class A(a: Int)(b: Int)
defined class A
scala> val a = A(0)(1)
a: A = A(0)
scala> a.copy()()
res9: A = A(0)
scala> :javap -private A
Compiled from "<console>"
public class A extends java.lang.Object implements scala.ScalaObject,scala.Product,scala.Serializable{
private final int a;
private final int b;
public scala.collection.Iterator productIterator();
public scala.collection.Iterator productElements();
public int a();
public A copy(int, int);
public int copy$default$2(int);
public int copy$default$1();
public int hashCode();
public java.lang.String toString();
public boolean equals(java.lang.Object);
public java.lang.String productPrefix();
public int productArity();
public java.lang.Object productElement(int);
public boolean canEqual(java.lang.Object);
private final boolean gd1$1(int);
public A(int, int);
}
이 질문에 대한 답변이 아니지만 'scalac -print Whatever.scala' 컴파일러에'-print' 플래그를 사용하여 스칼라가 사례 클래스에 생성하는 메서드를 직접 볼 수 있습니다. –