scala伴生对象,apply()及单例
1:伴生对象与apply方法
如果一个class与一个object具有相同的名字,那么我们就认为它们互为伴生。object为class的伴生对象。如下图所示,object Apply为class Apply的伴生对象。
需要注意的小细节是,伴生对象的apply函数哪怕没有参数也需要加上一对”()”.
class Apply { def apply = { println(" class apply") } def test = println("class test") } object Apply{ def apply() = {//注意这里的apply()函数定义哪怕没有参数,也不能省略() println("object apply") new Apply } } object main_ extends App{ val apply = Apply() apply.test }
我们可以在伴生对象里实现apply函数,在函数里做一些事情,如果我们想要得到class对象的实例,而没有通过new的方式,那么它会先去执行该class的伴生对象的apply函数
执行上述代码,结果:
object apply
class test
可以看到,第一行代码得到一个apply对象,它首先执行了伴生对象的apply(),然后执行了class Apply的test(),可以表明它确实是一个class Apply对象。
apply的应用:
比如可以用来实现单例,需要两个步骤,一把class的构造设为private,二在class的伴生对象里实现apply函数,在这里返回class的对象。
class Apply private {//构造函数私有化 def apply = { println(" class apply") } def test = println("class test") } object Apply{ val apply_i = new Apply()//伴生对象可以访问类的私有属性和函数 def apply() = {//注意这里的apply()函数定义哪怕没有参数,也不能省略() println("object apply") apply_i } } object main_ extends App{ // val apply = Apply() // apply.test for(i <- 0 until 10){ val apply_i = Apply() println(apply_i) } }
执行代码结果:
可以看到均为同一对象。
苍茫之天涯,乃吾辈之所爱也;浩瀚之程序,亦吾之所爱也,然则何时而爱耶?必曰:先天下之忧而忧,后天下之爱而爱也!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述