Scala面向对象语法(对象的其他语法差异总结)

1 单例模式

  • 如果构造方法私有化,那么想要在类的外部构建对象是不可能的,所以需要通过静态方法获取类的对象,如果获取对象时,这个对象只创建一次,那么这样的对象我们称之为单例对象

我们先看Java的

1.1 Java饿汉式

public class Java02_Single {

    private static Java02_Single instance = new Java02_Single();

    private Java02_Single(){

    }

    private static Java02_Single getInstance(){
        return instance;
    }
}

1.2 Java懒汉式

public class Java02_Single {

    private static Java02_Single instance = new Java02_Single();

    private Java02_Single(){

    }

    private static Java02_Single getInstance(){
        
        if(instance == null){
            /*
            不能什么对象调用的时候都新赋值
            只有对象是null的时候才新建对象
             */
            instance = new Java02_Single();
        }
        
        
        return instance;
    }


}

1.3 改良版Java懒汉式

    private Java02_Single() {}

    /*
    使用静态内部类;
    解决线程安全、并发问题;
     */
    private static class SingletonInstance {
        // 类不加载,也不会创建下面这个对象;也不会占用空间;是饿汉模式
        private static final Java02_Single INSTANCE = new Java02_Single();
    }

    public static Java02_Single getInstance() {
        return SingletonInstance.INSTANCE;
    }

1.4 Scala单例模式

object Scala03_Single{
  def test()={
    println("测试")
  }
}

/**
 * 利用伴生对象(类对象)
 */
object SingleTest{
  def main(args: Array[String]): Unit = {
    Scala03_Single.test()
  }
}

2 伴生对象

在 Scala 中,如果在同一个源码文件中,同时存在使用 object 声明的类对象(Person)以及使用 class 声明的类(Person),那么这个类对象就是该类的伴生对象,而这个类就是这个类对象的伴生类

// person.scala
class Person { // 伴生类
}
object Person { // 伴生对象
}
  • 注: 类和它的伴生对象可以相互访问私有属性或方法,他们必须存在同一个源文件中。必须同名。
  • 从技术的角度来讲, 伴生对象和伴生类其实是两个不同的类, 伴生对象所对应的类可以简答的理解为伴生类的辅助工具类。而伴生对象就是这个辅助工具类的单例对象,专门用于处理伴生类中静态资源的相关功能.
  • 伴生对象既然是一个单例对象,就意味着类已经声明过了,所以,伴生(类)对象是不能声明构造器的

3 apply 方法

  • 因为伴生对象可以处理静态资源,所以完全可以通过伴生对象提供的方法对伴生类进行处理

增加 apply 方法,构建伴生类实例

class Scala04_Apply {
  def this(n:String){
    this()
  }
}

object Scala04_Apply{
  def apply(): Scala04_Apply = {  //在伴生对象中实现 apply 方法。
    return new Scala04_Apply()  // 这里也可以采用单例模式实现
  }

  def apply(n:String): Scala04_Apply = {
    new Scala04_Apply(n)
  }
}

object ApplyTest{
  def main(args: Array[String]): Unit = {
    val apObj = Scala04_Apply()
    /*
    此处不需要使用 new 关键字,而是直接增加小括号,在执行时,会
     自动调用伴生对象中的 apply 方法。返回伴生类实例对象
     */

    val apObj2 = Scala04_Apply("李四")

    println(apObj)
    println(apObj2)
  }
}
com.nefu.scala.chaptor03.Scala04_Apply@35851384
com.nefu.scala.chaptor03.Scala04_Apply@649d209a

Process finished with exit code 0

4 枚举对象

枚举是穷举的意思,把所有的可能的对象都创建出来。
解决逻辑混乱问题,把可能性都规定出来。
枚举就是单例模式的多例版。
Scala 中没有枚举类型,定义一个扩展 Enumeration 类的对象,并以 Value 调用初始化枚举中的所有可能值,模拟枚举类型。

object LightColorEnum extends Enumeration {
  //扩展了一个Enumeration的特质
  val Red = Value(0, "Stop")  //用value类型简介实现。
  val Yellow = Value(1, "Slow")
  val Green = Value(2, "Go")
}


object ApplyTest{
  def main(args: Array[String]): Unit = {
	  println(LightColorEnum.Red)
  }


}
Stop

Process finished with exit code 0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值