Все компилируемые примеры (A
, B
, D
, E
) занимают одинаковое количество дискового пространства.Фактически, даже
class F(val bar: String) extends A(bar)
будет хранить данные в одном поле - он просто получает дополнительный метод доступа для того же поля.Однако, если вы
class G(var bar: String) extends A(bar)
, создается новое поле.
Вы можете проверить все это, скомпилировав свои примеры выше и посмотрев байт-код из javap -c Classname
(обратите внимание на поле put2:
в конструкторе A
):
public class Sizes$A extends java.lang.Object implements scala.ScalaObject{
public java.lang.String foo();
Code:
0: aload_0
1: getfield #11; //Field foo:Ljava/lang/String;
4: areturn
public Sizes$A(java.lang.String);
Code:
0: aload_0
1: aload_1
2: putfield #11; //Field foo:Ljava/lang/String;
5: aload_0
6: invokespecial #18; //Method java/lang/Object."<init>":()V
9: return
}
(И отсутствие дополнительного пут-поля в F
...)
public Sizes$F(java.lang.String);
Code:
0: aload_0
1: aload_1
2: invokespecial #15; //Method Sizes$A."<init>":(Ljava/lang/String;)V
5: return
(И наличиеодин раз в G
...)
public Sizes$G(java.lang.String);
Code:
0: aload_0
1: aload_1
2: putfield #11; //Field bar:Ljava/lang/String;
5: aload_0
6: aload_1
7: invokespecial #18; //Method Sizes$A."<init>":(Ljava/lang/String;)V
10: return