关于scala中的class和object
1.伴生对象(object)为class实现单例
在 Scala 中,是没有 static 这个东西的,但是它也为我们提供了单例模式的实现方法,那就是使用关键字 object。
Scala 中使用单例模式时,除了定义的类之外,还要定义一个同名的 object 对象,它和类的区别是,object对象不能带参数。
当单例对象与某个类共享同一个名称时,他被称作是这个类的伴生对象:companion object。你必须在同一个源文件里定义类和它的伴生对象。类被称为是这个单例对象的伴生类:companion class。类和它的伴生对象可以互相访问其私有成员。
class ApplyTest private{ //添加private隐藏构造器
def sayHello(){
println("hello jop")
}
}
object ApplyTest{
var instant:ApplyTest=null
def apply() ={
if(instant==null) instant=new ApplyTest
instant
}
}
object ApplyDemo {
def main(args:Array[String]){
val t=ApplyTest()
t.sayHello()
}
}
2.伴生对象(object)为class初始化
在object中一般可以为伴生类做一些初始化等操作,如我们常常使用的val array=Array(1,2,3) (ps:其使用了apply方法)
//私有构造方法
class Marker private(val color:String) {
println("创建" + this)
override def toString(): String = "颜色标记:"+ color
}
// 伴生对象,与类共享名字,可以访问类的私有属性和方法
object Marker{
private val markers: Map[String, Marker] = Map(
"red" -> new Marker("red"),
"blue" -> new Marker("blue"),
"green" -> new Marker("green")
)
//apply就是构造函数,用来初始化变量
def apply(color:String) = {
if(markers.contains(color)) markers(color) else null
}
def getMarker(color:String) = {
if(markers.contains(color)) markers(color) else null
}
def main(args: Array[String]) {
println(Marker("red"))
// 单例函数调用,省略了.(点)符号
println(Marker getMarker "blue")
}
}
总结:
- 因为class没有static关键字,如果需要使用静态的变量,实现单例等等,就需要借助object(伴生对象)来完成。
- object里面所有的东西都是静态的,所以object里面可以定义main函数,class想要被使用,只能在object中实例化,也就是new TestClass()。