Scala 伴生对象

在Scala中,类和对象可以共享同一个名称。

当一个对象与一个类共享一个名称时,它被称为伴生对象,并且该类被称为伴生类。

伴生对象是与另一个类或特征共享相同名称和源文件的对象。(需要在一个文件下)

一个trait可以看作是一个Java接口。

这种方法允许我们在类上创建静态成员。

伴生对象对实现辅助方法和工厂很有用。

要实现一个创建不同类型的形状的工厂,我们可以在Scala中创建一个形状工厂。

类和它的伴生对象可以互相访问其私有成员。

例子

我们使用一个伴生类Shape和一个伴生对象Shape,作为一个工厂。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
trait Shape {
def area :Double
}
object Shape {
private class Circle(radius: Double) extends Shape{
override val area = 3.14*radius*radius
}
private class Rectangle (height: Double, length: Double)extends Shape{
override val area = height * length
}
def apply(height :Double , length :Double ) : Shape = new Rectangle(height,length)
def apply(radius :Double) : Shape = new Circle(radius)

}

object Main extends App {
val circle = Shape(2)
println(circle.area)
val rectangle = Shape(2,3)
println(rectangle.area)
}

更直观的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
object Companion {
// 伴生类 和 伴生对象
// 1、class和object在同一个scala文件中
// 2、class和object要同名
// 特征:
// 1、伴生类和伴生对象可互访私有成员
// 2、伴生对象 的apply方法,可简化 伴生类之对象 的创建
// 感性认识:
// class里面的全是 非静态的,object里面的全是 静态的
def main(args: Array[String]): Unit = {
val person = new Person
// print(person.name)
// print(person.age)
println(Person.param)
// Person.add()

println(person.sum(11, 22))

Person.printAge

val p1: Person = Person.apply()
val p2: Person = Person() // 相当于 Person.apply()
}
}

//伴生类
class Person {
val name = "Jacky"
private val age = 20

// 访问伴生对象的私有方法
def sum(x: Int, y: Int) = Person.add(x, y)
}

//伴生对象
object Person {
val param = "100"

private def add(x: Int, y: Int) = x + y

// 通过 伴生对象,访问 伴生类 的私有成员 时,必须要有 伴生类的对象
def printAge = println(s"age=${new Person().age}")

def apply(): Person = new Person()
}

注意

与伴生类不共享相同名称的单例对象称为独立对象。

转载自:

https://www.w3cschool.cn/scala/scala-companion-objects.html
https://www.jianshu.com/p/26bd596090f6


Scala 伴生对象
http://seddon.lol/2022/11/19/Scala-伴生对象/
作者
Seddon
发布于
2022年11月19日
许可协议