区别 Scala Class 声明
Difference Scala Class Declaration
我想问一下下面这两个Class声明有什么区别
class Person(name: String, age: Int)
或
class Person() {
var name: String = ""
var age: Int = 0
}
第一个声明使用name
和age
作为构造函数参数,但它们不会成为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 会自动为您提供正确的 equals
和 hashCode
实现,以及我在上面使用的 copy
方法。您可以在互联网上轻松找到有关它们的更多信息。
class Person(name: String, age: Int)
name
和 age
是构造函数参数。因此它们是:
- 需要 - 为了创建一个
Person
实例
- 不可变 - 值无法更改
- private -(默认情况下)并且无法通过 class 实例访问
class Person() {
var name: String = ""
var age: Int = 0
}
name
和 age
是 class 数据成员。他们是:
- 构造期间未指定 - 但每个
Person
实例都被赋予相同的默认值
- 可变 - 因为它们是
var
变量
- public -(默认情况下)并且可以通过 class 实例
访问和修改
那么,有什么区别呢?几乎所有。
我想问一下下面这两个Class声明有什么区别
class Person(name: String, age: Int)
或
class Person() {
var name: String = ""
var age: Int = 0
}
第一个声明使用name
和age
作为构造函数参数,但它们不会成为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 会自动为您提供正确的 equals
和 hashCode
实现,以及我在上面使用的 copy
方法。您可以在互联网上轻松找到有关它们的更多信息。
class Person(name: String, age: Int)
name
和 age
是构造函数参数。因此它们是:
- 需要 - 为了创建一个
Person
实例 - 不可变 - 值无法更改
- private -(默认情况下)并且无法通过 class 实例访问
class Person() {
var name: String = ""
var age: Int = 0
}
name
和 age
是 class 数据成员。他们是:
- 构造期间未指定 - 但每个
Person
实例都被赋予相同的默认值 - 可变 - 因为它们是
var
变量 - public -(默认情况下)并且可以通过 class 实例 访问和修改
那么,有什么区别呢?几乎所有。