前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >2021年大数据常用语言Scala(二十九):scala面向对象 单例对象

2021年大数据常用语言Scala(二十九):scala面向对象 单例对象

作者头像
Lansonli
发布2021-10-11 15:36:10
4150
发布2021-10-11 15:36:10
举报
文章被收录于专栏:Lansonli技术博客

单例对象

Scala中没有static关键字,但是它支持静态

如果要定义静态的东西,统统定义到object中

语法:

object xxx{ // 内容 }

反向理解,class中的东西, 全部是 非静态的

定义object - 掌握

定义单例对象和定义类很像,就是把class换成object

示例:定义一个工具类,用来格式化日期时间

代码语言:javascript
复制
object DateUtils {

  // 在object中定义的成员变量,相当于Java中定义一个静态变量
  // 定义一个SimpleDateFormat日期时间格式化对象
  val simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm")

  // 构造代码
  println("构造代码")
    
  // 相当于Java中定义一个静态方法
  def format(date:Date) = simpleDateFormat.format(date)

  // main是一个静态方法,所以必须要写在object中
  def main(args: Array[String]): Unit = {
    println { DateUtils.format(new Date()) };
  }
}

使用object 单例对象名定义一个单例对象,可以用object作为工具类或者存放常量

在单例对象中定义的变量,类似于Java中的static成员变量

在单例对象中定义的方法,类似于Java中的static方法

object单例对象的构造代码可以直接写在花括号中

调用单例对象的方法,直接使用单例对象名.方法名,访问单例对象的成员变量也是使用单例对象名.变量名

单例对象只能有一个无参的主构造器,不能添加其他参数

伴生对象 - 掌握

在Java中,经常会有一些类,同时有实例成员又有静态成员。如下:

代码语言:javascript
复制
public class CustomerService {

    private static Logger logger = Logger.getLogger("customerService");

    public void save(String customer) {
        logger.info("添加一个用户");
        // 保存客户
    }

    public static void main(String[] args) {
        new CustomerService().save("客户");
    }
}

在scala中,可以使用伴生对象来实现。

一个class和object具有同样的名字。这个object称为伴生对象,这个class称为伴生类

实例1:使用scala重写上面的案例。

代码语言:javascript
复制
class CustomerService {

  private val serviceName = "CustomerService"

  def save(customer:String):Unit = {
    // 在类中可以获取伴生对象的私有成员变量
    CustomerService.logger.info("添加一个用户")
    // 新增客户
  }
}

// 定义一个伴生对象
object CustomerService {
  // 定义一个日志器
  private val logger = Logger.getLogger("CustomerService")

  def main(args: Array[String]): Unit = {
    val customerService = new CustomerService()
    customerService.save("张三")

    // 在伴生对象中也可以访问伴生类的私有方法
    println(customerService.serviceName)
  }
}

伴生类和伴生对象的名字必须是一样的

伴生类和伴生对象需要在一个scala源文件中

伴生类和伴生对象可以互相访问private的属性

apply方法 - 掌握

我们之前使用过这种方式来创建一个Array对象。

代码语言:javascript
复制
// 创建一个Array对象
val a = Array(1,2,3,4)

这种写法非常简便,不需要再写一个new,然后敲一个空格,再写类名。如何直接使用类名来创建对象呢?

查看scala源代码:

答案就是:实现伴生对象的apply方法

伴生对象的apply方法用来快速地创建一个伴生类的对象。

示例1:

代码语言:javascript
复制
class Person(var name:String, var age:Int) {

  override def toString = s"Person($name, $age)"
}

object Person {
  // 实现apply方法
  // 返回的是伴生类的对象
  def apply(name:String, age:Int): Person = new Person(name, age)

  // apply方法支持重载
  def apply(name:String):Person = new Person(name, 20)

  def apply(age:Int):Person = new Person("某某某", age)

  def apply():Person = new Person("某某某", 20)
}

object Main2 {
  def main(args: Array[String]): Unit = {
    val p1 = Person("张三", 20)
    val p2 = Person("李四")
    val p3 = Person(100)
    val p4 = Person()

    println(p1)
    println(p2)
    println(p3)
    println(p4)
  }
}

当遇到类名(参数1, 参数2...)会自动调用apply方法,在apply方法中来创建对象

定义apply时,如果参数列表是空,也不能省略括号(),否则引用的是伴生对象

main方法

scala和Java一样,如果要运行一个程序,必须有一个main方法。而在Java中main方法是静态的,而在scala中没有静态方法。在scala中,这个main方法必须放在一个object中。

示例1:

代码语言:javascript
复制
object Main5 {
  def main(args:Array[String]) = {
    println("hello, scala")
  }
}

也可以继承自App Trait(特质),然后将需要编写在main方法中的代码,写在object的构造方法体内。

示例2:

代码语言:javascript
复制
object Main5 extends App {
  println("hello, scala")
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/05/10 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 单例对象
    • 定义object - 掌握
      • 伴生对象 - 掌握
        • apply方法 - 掌握
          • main方法
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档