zoukankan      html  css  js  c++  java
  • scala学习手记15

    上一节中的单例对象MarkerFactory 就是一个独立对象的例子。尽管它管理着Marker类,但是它并没有关联到任何类上。

    scala也可以创建关联到类上的对象。这样的对象同类共享同一个名字,这样的对象称为伴生对象,对应的类就称为伴生类。在scala里,类和伴生对象没有界限,它们互相可以访问彼此的private 方法和private 属性。下面使用伴生对象重写了Marker:

    class Marker private(val color: String) {
      println("Creating " + this)
      override def toString(): String = "marker color " + color
    }
    
    object Marker {
      private val markers = Map("red" -> new Marker("red"),
                                  "blue" -> new Marker("blue"),
                                  "green" -> new Marker("green"))
    
      def getMarker(color: String) =
            if (markers.contains(color)) markers(color) else null
    }

    在重构后的代码中为Marker类新建了伴生对象,伴生对象就是Marker类的实例了。此外还使用private修饰了Marker的主构造函数,确保只有它的伴生对象可以创建Marker类的实例,从而保证了Marker类的单例特性。当然了,也可以不把Marker类的主构造函数声明为private,但是此时Marker对象作为Marker类的单例实现就仍是不严密的。

    使用如下的代码调用Marker类:

    println(Marker getMarker "blue")
    println (Marker getMarker "blue")
    println (Marker getMarker "red")
    println (Marker getMarker "red")

    输出如下:

    image

    每个类都可以有伴生对象。伴生对象和伴生类写在同一个文件中,伴生对象在scala中很常见,它们提供了在类一级进行操作的便捷方法。从某种方面来说,它们还可以作为scala缺少静态成员的变通措施。

    ######

  • 相关阅读:
    sql server版本、组件和管理工具
    asp.net WebService如何去掉asmx后缀
    通过C#发送自定义的html格式邮件
    asp.net上传图片到服务器
    分享一个C#自定义事件的实际应用
    推荐一个ASP.NET网站内容管理系统源码
    asp.net读取模版并写入文本文件
    Win10命令提示符(cmd)怎么复制粘贴
    配置IIS的通配符应用程序映射
    用c-free 5写一个入门的程序
  • 原文地址:https://www.cnblogs.com/amunote/p/5599105.html
Copyright © 2011-2022 走看看