区别 Scala Class 声明

Difference Scala Class Declaration

我想问一下下面这两个Class声明有什么区别

class Person(name: String, age: Int)

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

第一个声明使用nameage作为构造函数参数,但它们不会成为class的成员,也就是说你不能写person.name .

对于初学者来说,第二行可以算是比较复杂的写法class Person(var name: String = " ", var age: Int = 0)。它实际上并没有转化为完全相同的东西:你的版本创建了一个 class ,它有一个构造函数参数和两个 public 变量,而我的版本有一个构造函数,有两个参数有默认值。除非你有充分的理由以你的方式声明它,否则通常最好这样写:

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)

在这种情况下,两个参数都被认为是 public 并且是不可变的。修改人名的唯一方法是用新名字创建另一个 Person 实例:

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

Case classes 会自动为您提供正确的 equalshashCode 实现,以及我在上面使用的 copy 方法。您可以在互联网上轻松找到有关它们的更多信息。

class Person(name: String, age: Int)

nameage 是构造函数参数。因此它们是:

  • 需要 - 为了创建一个Person实例
  • 不可变 - 值无法更改
  • private -(默认情况下)并且无法通过 class 实例访问

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

nameage 是 class 数据成员。他们是:

  • 构造期间未指定 - 但每个 Person 实例都被赋予相同的默认值
  • 可变 - 因为它们是 var 变量
  • public -(默认情况下)并且可以通过 class 实例
  • 访问和修改

那么,有什么区别呢?几乎所有。