美文网首页我爱编程
essential scala: 伴生对象

essential scala: 伴生对象

作者: 周一不上班 | 来源:发表于2018-04-13 21:05 被阅读21次

essential scala: 伴生对象

有时候我们想创建属于类的方法,在java中使用static关键字. 在scala中使用单例对象实现. class中的方法可以看作是static的,对象中的方法则可以看作是对象所独有的方法.

一种常见应用就是实现多个构造函数. 虽然scala在语法上完全可以给一个class添加多个构造函数,但是scala程序员比较倾向于写一个同名单例对象,在这个单例中实现apply方法. 往往把这个同名对象叫做这个class的伴生对象(companion object).

class Timestamp(val seconds: Long)
object Timestamp {
    def apply(hours: Int, minutes: Int, seconds: Int): Timestamp =
        new Timestamp(hours*60*60 + minutes*60 + seconds)
}
Timestamp(1, 1, 1).seconds
// res: Long = 3661

在scala终端中定义伴生对象

键入 :paste 进入粘贴模式. 因为伴生对象必须和其对应的class同时编译,意味着他们必须被定义在一个文件中,在交互式终端中要使用:paste. 使用:help获取更多帮助.

scala> :paste
// Entering paste mode (ctrl-D to finish)

重点说明的一点是,伴生对象并不是一个类的实例,而是一个拥有自己类型的单例对象.

Timestamp // note that the type is `Timestamp.type`, not `Timestamp`
// res: Timestamp.type = Timestamp$@602b24e6

语法

在同一个文件中,同名.

class Name {
...
}
object Name {
...
}

总结

伴生对象与对应的类紧密关联,但是不必创建任何类的实例,常用于额外的构造函数.

伴生对象替代了java的static方法,同样的功能同时更加灵活.

伴生对象和类同名,不会产生命名冲突是因为scala的两个命名空间,值空间和类型空间,相互独立.

伴生对象和对应的类必须定义在同一源文件中,当在终端中定义时,使用 :paste 模式.

练习

写一个类Person的伴生对象,实现使用全名来初始化Person

Person类的定义如下

class Person(val firstname:String, val lastname:String) {
    def name = firstname + " " + lastname
}

val关键字将参数同时定义为类的属性值.

参考解答

object Person {
    def apply(fullname:String) = {
        val parts = fullname.split(" ")
        new Person(parts(0), parts(1))
    }
    // another constructor without parameters
    def apply() = new Person("yourfirstname","yourlastname")  
}

终端中验证

scala> val p = Person("hell ooo")
p: Person = Person@11ce2e22

scala> p.firstname
res13: String = hell

scala> p.lastname
res14: String = ooo

相关文章

  • essential scala: 伴生对象

    essential scala: 伴生对象 有时候我们想创建属于类的方法,在java中使用static关键字. 在...

  • scala-08-伴生对象

    基本介绍 1)Scala中伴生对象采用object关键字声明,伴生对象中声明的全是 "静态"内容,可以通过伴生对象...

  • Spark常见面试题

    1、scala 语言有什么特点,相比java有什么优点? 2、什么是Scala的伴生类和伴生对象? 3、spark...

  • 好程序员大数据培训分享scala单列和伴生对象

    好程序员大数据培训分享scala单列和伴生对象 scala单例 object SingletonDemo { de...

  • Scala(五)-②-面相对象高级-静态属性和方法、特质(上)

    ① 伴生对象和伴生类 ①-① Why Scala语言是完全面相对象的,并不支持静态这个概念,也就没有静态成员(静态...

  • scala学习笔记

    在scala中,类和它的伴生对象可以相互访问对方的私有对象 classPerson{privatevar_age=...

  • scala 知识点2

    1. 伴生对象 在Java中,我们经常需要用到同时包含实例方法和静态方法的类,在Scala中可以通过伴生对象来实现...

  • Scala单例对象、伴生对象

    在Scala中,没有静态成员、静态方法这一说,但是object可以做到类似效果: 结果:1、2 如果,同时存在一个...

  • scala学习笔记-case class

    伴生对象 当单例对象与某个类共享同一个名称时,它就被称为是这个类的伴生对象 scala类里面没有静态方法和静态字段...

  • Scala 单例对象与伴生对象

    单例对象 Scala单例对象是十分重要的,因为没有像在Java一样,有静态类、静态成员、静态方法,但是Scala提...

网友评论

    本文标题:essential scala: 伴生对象

    本文链接:https://www.haomeiwen.com/subject/llyhkftx.html