Декларация класса различия Scala - PullRequest
0 голосов
/ 25 января 2019

Я хочу спросить, в чем разница между этими двумя объявлениями классов ниже.

class Person(name: String, age: Int)

или

class Person() {
  var name: String = ""
  var age: Int = 0
}

Ответы [ 2 ]

0 голосов
/ 25 января 2019
class Person(name: String, age: Int)

name и age являются параметрами конструктора.Как таковые они:

  • требуется - для создания Person экземпляра
  • неизменяемого - значения не могут быть изменены
  • частный - (по умолчанию) и недоступен через экземпляр класса

class Person() {
  var name: String = ""
  var age: Int = 0
}

name и age являются классомчлены данных.Это:

  • не указано во время построения - но им присваиваются одинаковые значения по умолчанию для каждого Person экземпляра
  • изменяемого -потому что они var переменные
  • публичные - (по умолчанию) и могут быть доступны и изменены с помощью экземпляра класса

Итак, чторазличия?Почти все.

0 голосов
/ 25 января 2019

Первое объявление использует name и age в качестве аргументов конструктора, но они не становятся членами класса, то есть вы не можете написать person.name.

Для новичка вторую строку можно считать более сложным способом написания class Person(var name: String = " ", var age: Int = 0). На самом деле это не означает, что ваша версия создает класс с одним аргументом конструктора и двумя открытыми переменными, а у моей - конструктор с 2 аргументами, значения которых по умолчанию. Если у вас нет веской причины объявить это по-своему, обычно лучше написать:

val person = new Person("Andrew", 11)

чем

val person = new Person()
person.name = "Andrew"
person.age = 11 

что и заставит вас делать вторая версия.

Обратите внимание, что в Scala вы будете в основном использовать значения (константы), а не переменные, поэтому обычно вы используете class Person(val name: String = " ", val age: Int = 0). Для простых типов данных, подобных этому, люди обычно используют case class:

case class Person(name: String, age: Int)

В этом случае оба аргумента считаются публичными и неизменными. Единственный способ изменить имя человека - создать еще один экземпляр Person с новым именем:

val andrew = Person("Andrew", 11)
val will = andrew.copy(name="Will") # Will is also 11

Классы Case автоматически предоставят вам правильную реализацию equals и hashCode, а также метод copy, который я использовал выше. Вы можете легко найти больше информации о них в Интернете.

...