Scala中的单例对象、伴生对象和伴生类

单例对象

这个是scala提供的!

object 对象名{
    // 也可以写代码
    def main(args: Array[String]){
        // 入口
    }
}

继承了Apptrait

object Hello extends App {
  println("Hello, World!")
}

伴生类和伴生对象

一个scala文件中如果有名字相同的classobject,那么他们就互为伴生!

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

这样就可以有效的控制创建对象的数量!避免出现对象超生情况!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值