Scala: какова реальная разница между полями в классе и параметрами в конструкторе
В чем разница между этими двумя классами:
class Person {
var name : String = _
var surname: String = _
}
class Person (var name:String, var surname: String)
имя и фамилия всегда являются полями класса. В равной степени?
Я просто изменяю способ создания класса Person.
Правильно ли это?
Ответы
Ответ 1
Я скомпилировал обе версии класса:
class PersonV0 {
var name : String = _
var surname: String = _
}
class PersonV1 (var name:String, var surname: String)
Разница заключается в конструкторах:
public experimental.PersonV0();
Code:
0: aload_0
1: invokespecial #23; //Method java/lang/Object."<init>":()V
4: return
}
public experimental.PersonV1(java.lang.String, java.lang.String);
Code:
0: aload_0
1: aload_1
2: putfield #12; //Field name:Ljava/lang/String;
5: aload_0
6: aload_2
7: putfield #16; //Field surname:Ljava/lang/String;
10: aload_0
11: invokespecial #24; //Method java/lang/Object."<init>":()V
14: return
}
Ответ 2
Разница между ними заключается в том, что во втором случае поля также являются параметрами для конструктора. Если вы объявляете параметры как val
или var
, они автоматически становятся открытыми. Если у вас нет var
/val
и не используйте переменные нигде, кроме конструктора, они не станут членами, если вы это сделаете, они станут частными членами. Если вы сделаете их case class
es, вы бы в первом случае не имели права использовать переменные.
Итак, чтобы ответить на ваш вопрос: в этом случае вы правы, вы просто изменяете способ установки значений.
изменить:
Совет: вы можете видеть, что генерирует компилятор scala, если вы вызываете компилятор с -print
, это также работает для REPL.