Сначала очевидное: байт-код больше из-за созданных дополнительных методов.
Классы Case сохраняют параметры первого списка параметров как val
члены.Если вам не нужен доступ к параметру, кроме как во время создания объекта, это бесполезно.
Начиная с Scala 2.8, классы case также сохраняют параметры из последующих разделов параметров для поддержки метода copy
.Это подробности реализации, и может быть изменено .
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);
}