scala单例object与伴生object入门
概念
object是一个特殊的类,特殊在这个类只有一个实例.并且是懒加载的,就是用到的时候才创建.
当对象定义于顶层时(即没有包含在其他类中),单例对象只有一个实例。
当对象定义在一个类或方法中时,单例对象表现得和惰性变量一样。
作用
为什么会有object这个概念,因为scala没有static关键字,无法创建单例,等原因
用法
singleton object
//object就是个单例,此处单例名字叫做Logger1.
object Logger1 {def info(msg: String): Unit = println(s"INFO:$msg")
}class MID {//单例的方法可以像java中静态类的方法一样调用Logger1.info("created objects");
}object Test2 {def main(args: Array[String]): Unit = {//可以像调用静态类的方法一样调用object中的方法Logger1.info("hello,world") //INFO:hello,world//创建新的MID对象时val m = new MID() //INFO:created objects}
}
证明object是个单例的方式
object Test extends App {//证明的确是个单例,因为创建2个是相同的private val singletone1: Singletone.type = Singletone.getInstance()private val singletone2: Singletone.type = Singletone.getInstance()println((singletone1 == singletone2))//true
}
//obejct 本身就是个单例,把自己返回下就行了
object Singletone{val singletone: Singletone.type =Singletonedef getInstance(): Singletone.type ={singletone}
}
Companion objects
scala中,与类名相同并且用object修饰的对象时 伴生对象.class和companion之间可以互相访问私有的方法和属性,他们必须在同一个源文件中
简而言之,就是可以互相访问,不管私有还是公有. 如果不是伴生对象,那只能是单例对象了,可以通过类名.方法
的形式访问
class Compaion {var id = 0private val name = "xiaohong"private[this] var age = 18private def getAge: Int = age//访问伴生object的私有属性addressdef getAddress(): Unit = println(Compaion.address)
}object Compaion {private val address = "beijing"def main(args: Array[String]): Unit = {val co = new Compaion()//访问伴生class的属性idco.id = 1println(co.id) //1//访问伴生class的属性nameprintln(co.name) //xiaohong//访问伴生class的私有方法println(co.getAge) //18co.getAddress() //beijing}
}
apply方法在伴生对象中的应用
用了后创建伴生class对象时可以少些个new,apply 方法在源码中的应用还是比较多的.
object Test extends App {//创建对象时无需new,传参实际上传给了apply方法val m=Man("李明",20)m.showinfo()//李明 is 20 years old
}//构造函数私有.这里其实有点像单例了
class Man private(name:String,age:Int){def showinfo(): Unit ={println(s"$name is $age years old")}
}
//伴生object中定义apply方法,后续创建对象就会比较简单
object Man{def apply(name: String, age: Int): Man = new Man(name, age)
}
如果是个case class,可以不用写apply方法,系统会自动在其伴生类中生成一个apply方法!
object Test extends App {val m = Man("李明", 20)m.showinfo() //李明 is 20 years old
}case class Man private(name: String, age: Int) {def showinfo(): Unit = {println(s"$name is $age years old")}
}object Man {}
App对象
可以不用写main方法就能执行,原理看源码
object HelloApp extends App{println("hello world")//hello world
}
总结
- 单例object,像静态类一样用
- 伴生object,可以和伴生class互相访问
- apply方法,创建对象不需要new关键字!
- case class默认会给其伴生对象生成apply方法
scala单例object与伴生object入门相关推荐
- Scala单例对象(伴生对象)
概念 Scala语言是完全面向对象的语言,所以并没有静态的操作(即在Scala中没有静态的概 念).但是为了能够和Java语言交互(因为Java中有静态概念),就产生了一种特殊的对象 来模拟类对象,该 ...
- 【Kotlin】Kotlin 单例 ( 懒汉式 与 恶汉式 | Java 单例 | Kotlin 单例 | 对象声明 | 伴生对象 | get 方法 | ? 与 !! 判空 )
文章目录 I . 单例的懒汉式与恶汉式 II . Java 中的懒汉式与恶汉式 III . Kotlin 中对应 Java 的懒汉式与恶汉式 IV . Kotlin 对象 ( object ) 声明 ...
- Scala类的定义,主/辅构造器,以及方法中的变量定义,单例对象,伴生对象,Apply方法调用,应用程序对象
1. 类 1.1. 类的定义 package cn.toto.scala.day2/*** 在Scala中,类并不用声明为public类型的.* Scala源文件中可以包含多个类,所有这些类都具有共有 ...
- Android学习-Kotlin语言入门-变量、函数、语法糖、when、for-in、主构造函数、单例类、函数式API、集合遍历、隐式Intent、Activity生命周期、四种启动模式、标准函数
探究java语言的运行机制 变量.函数.语法糖 when条件语句 for循环 主构造函数.次构造函数 数据类和单例类 集合的创建与遍历 集合的函数式API 创建菜单 隐式使用Intent Activi ...
- java单例设计及其在jdk中的应用
什么是单例 单例是要解决一个类只能有一个对象的问题,为什么要做这个限制? 单例如何实现 如何实现单例,把constructor私有化,不能new了,此时一个实例都没有了 constructor虽然私有 ...
- python 单例类
1.创建单例类 class CCP(object):def __new__(cls,*args,**kwargs):if not hasattr(cls,'_instance'): # 如果类对象中没 ...
- 静态内部类实现单例_为什么用枚举类来实现单例模式越来越流行?
前言 单例模式是 Java 设计模式中最简单的一种,只需要一个类就能实现单例模式,但是,你可不能小看单例模式,虽然从设计上来说它比较简单,但是在实现当中你会遇到非常多的坑,所以,系好安全带,上车. 单 ...
- python3的配置文件类单例实现_单例模式的几种实现方式及对比
来源:博客园 作者:为何不是梦 链接:https://www.cnblogs.com/ibigboy/p/11423613.html 所谓单例就是在系统中只有一个该类的实例. 单例模式的核心分以下三个 ...
- Django验证码*短信验证码之2-容联云通讯短信平台(联云通讯短信平台介绍、容联云通讯Python SDK、封装发送短信单例类)
容联云通讯短信平台介绍 容联云通讯网址:https://www.yuntongxun.com/ 容联云管理控制台 容联云创建应用 容联云通讯Python SDK https://doc.yuntong ...
最新文章
- 工具类的方法怎么引用_Hutool中那些常用的工具类和方法
- Easyui 让DataGrid适应浏览器宽度
- 2020\Simulation_1\2.约数个数
- .NET开发框架(三)-高可用服务器端设计
- UDK编辑器 49条小提示(转)
- 使用C语言计算utf-8字符串长度 和取子字符串-转
- 如何在C / C ++中使用continue语句
- IO中的阻塞、非阻塞、同步、异步概念分析详解(通俗易懂)
- Hibernate 中 set 里的属性及定义
- C语言--------学生管理系统(源代码)
- WINCC的一套教程 有视频 有VBS开发基础 Excel导出
- Python_bug之Numpy问题
- 网络营销策略常见方法有哪些?
- 华硕主板如何设置开机自启_华硕主板每次开机都进bios 华硕主板开机总是自动进入了BIOS设置界面怎么办?...
- python获取cpu温度_Python如何读取CPU和GPU的温度?
- 零售商贩mysql表设计:banner+banner_item+image关联表(轮播图表)
- win10下安装华为Atals USB虚拟网卡驱动
- LeetCode-378.有序矩阵中第k小的元素、二分查找
- 一种改进的鲸鱼优化算法
- Java管理扩展指南之MBean简介
热门文章
- 低秩矩阵完备_矩阵之芯 SVD: 基本应用以及与其他分解的关系
- web后端语言_web前端学习路线图_快速入门web前端学习路线图
- linux下备份msyql数据库
- 广数系统980tdb系统说明书_不同数控系统中各个倒角指令的用法
- linux 内核dump,linux内核调试技巧之一 dump_stack【转】
- 区块链开发指南_区块链软件开发详解
- linux新建java文件夹删除不了怎么办_Linux无法删除文件夹 Device or resource busy
- 怎样在接口地址中添加请求头参数_jmeter5.3做soap接口性能测试配置
- linux上数据库导入与导出(mysql)
- c语言上机实验作业答案,第十二次C语言上机实验参考答案