单例对象
这个是scala提供的!
object 对象名{
// 也可以写代码
def main(args: Array[String]){
// 入口
}
}
继承了App
trait
object Hello extends App {
println("Hello, World!")
}
伴生类和伴生对象
一个scala
文件中如果有名字相同的class
和object
,那么他们就互为伴生!
object User{
// 也可以写代码
def main(args: Array[String]){
// 入口
}
}
class User(val age: Int){
}
他们具有以下特性:
1.互相可以调用对方私有的成员。
2.伴生类和 伴生对象必须在同一个.scala
文件中
3.将来编译成字节码之后, 站在java
的角度, 伴生对象中的都是为成为静态成员, 伴生类中的成员都会成为非静态成员.
根据以上特点,可以总结出
-
如果希望封装的特性可以写到伴生类中
-
如果希望对外暴露,就写到伴生对象中
通过上面的方法可以做一个这样的案例,从而体现封装性!
利用对构造器添加一个私有关键字来屏蔽外界对该类创建对象,对完暴露一个静态工厂类!实现一个工厂类,避免对象超生的情况!
这里引入一个工厂模式!
coding
package com.zhengkw.factory
import scala.collection.mutable
/**
*
* Date 2020/4/25 10:10
*/
object Human {
def main(args: Array[String]): Unit = {
println(makeHuman("黄"))
println(makeHuman("棕"))
println(makeHuman("棕"))
}
val humans: mutable.Map[String, Human] = mutable.Map[String, Human](
"黄" -> new Human("黄"),
"黑" -> new Human("黑"),
"白" -> new Human("白"))
def makeHuman(color: String) = humans.getOrElseUpdate(color, new Human(color))
}
// 主构造私有
class Human private (val color: String) {
println(s"创造 $color 种人")
override def toString: String = s"$color 种人"
def eat = println("eat...")
}
/*
静态工厂, 使用工厂类去创建对象, 屏蔽了创建对象的方法
把构造器私有, 就可以避免外界创建对象
*/
创造 黄 种人
创造 黑 种人
创造 白 种人
黄 种人
创造 棕 种人
棕 种人
棕 种人Process finished with exit code 0
这样就可以有效的控制创建对象的数量!避免出现对象超生情况!