ITPub博客

首页 > 大数据 > 数据挖掘 > 大数据学习:对象

大数据学习:对象

原创 数据挖掘 作者:andy888168 时间:2019-10-11 15:27:24 0 删除 编辑

大数据学习:对象

5.2.1. 单例对象

在Scala中没有静态方法和静态字段,但是可以使用object这个语法结构来达到同样的目的

1.scala类似于Java中的工具类,可以用来存放工具函数和常量

2.高效共享单个不可变的实例

3.单例模式

单例对象虽然类似于Java中的工具类,但它不是,还是一个对象,可以把单例对象名看做一个贴在对象上的标签。

package  logging
// 使用关键字 object 定义单例对象
object  Logger {
   def   info (message: String): Unit = println (s "INFO: $message" )
}

单例对象的使用

// 导入单例对象信息,使之在当前类可见
import  logging. Logger . info

class   Project (name: String, daysToComplete: Int)

class  Test {
   val  project1 = new   Project ( "TPS Reports" , 1 )
   val  project2 = new   Project ( "Website redesign" , 5 )
     // 调用单例对象中定义的方法
   info ( "Created projects" )   // Prints "INFO: Created projects"
}

类和单例对象的区别是,单例对象不能带参数,单例对象不能用new关键字实例化,所以没有机会传递给它实例化的参数。

单例对象在第一次访问的时候才会初始化。

当单例对象与某个类同名时,它被称为类的伴生对象,类和伴生对象必须定义在一个源文件里,类称为该单例对象的伴生类,类和他的伴生对象可以互相访问其私有成员。

不与伴生类共享名称的单例对象被称为独立对象,可以作为相关功能的工具类,或者scala应用程序的入口点。

5.2.2. 伴生对象

在Scala的类中,与类名相同并且用object修饰的对象叫做伴生对象,类和伴生对象之间可以相互访问私有的方法和属性,他们必须存在同一个源文件中

class  AccountInfo {
// 类的伴生对象的功能特性并不在类的作用域
// 所以不能直接用 newUniqueNumber() 调用伴生对象的方法
var  id = AccountInfo. newUniqueNumber ()
}

object   AccountInfo {
   private   var  lastNumber = 0
   private   def   newUniqueNumber () = {
    lastNumber += 1 ; lastNumber
  }

   def   main (args: Array[String]) {
   // 相当于 Java 中的静态方法调用
     println (AccountInfo. newUniqueNumber ())
  }

}

5.2.3. apply 方法

通常我们会在类的伴生对象中定义apply方法,当遇到类名(参数1,...参数n)时apply方法会被调用

class  AccountInfo {

}

object   AccountInfo {
   private   var  lastNumber = 0
   private   def   apply (arg :Int) = {
    lastNumber = arg* 2  + 1 ; lastNumber
  }

   def   main (args: Array[String]) {
     println ( AccountInfo ( 1 ))
  }

}

5.2.4. 应用程序对象

Scala程序都必须从一个对象的main方法开始,可以通过扩展App特质,不写main方法。

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

同

object  Hello {

   def   main (args: Array[String]): Unit = {
     println ( "Hello World" )
  }

}

5.2.5. 提取器

带有unapply方法的对象,经常用在模式匹配或者偏函数中。

import  scala. util . Random

object  CustomerID {

   def   apply (name: String) = s "$name--${Random.nextLong}"

   def   unapply (customerID: String): Option[String] = {
     val  name = customerID. split ( "--" ). head
     if  (name. nonEmpty ) Some(name) else  None
  }
}
// 调用 apply 方法创建一个对象,等价于 CustomerID.apply("Sukyoung")
val  customer1ID = CustomerID ( "Sukyoung" )   // Sukyoung--23098234908
customer1ID match  {
     // 调用 unapply 方法,提取 name 信息
   case   CustomerID (name) => println (name)   // prints Sukyoung
   case  _ => println ( "Could not extract a CustomerID" )
}

 


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69947096/viewspace-2659537/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
莫安迪分享各类资讯文章

注册时间:2019-09-02

  • 博文量
    69
  • 访问量
    43789