Scala之apply的用法

用法一: 用于构造函数作用

class Greet(val age: Int) {

  var name: String = ""

  def output(): Unit = {
    print(this.name + ", " + this.age)
  }

  override def toString: String = this.name + ": " + this.age
}

object Greet {

  def apply: Greet = {
    new Greet(0)
  }

  def apply(name: String, age: Int): Greet = {
    val greet = new Greet(age)
    greet.name = name
    greet
  }

  def unapply(arg: Greet): Option[(String, Int)] = {
    if (arg == null) {
      None
    } else {
      Some(arg.name, arg.age)
    }
  }
}

测试方法

object TestApply {
  def main(args: Array[String]): Unit = {
    val greet = Greet("Test", 30)  //没有使用new,调用的是apply方法;
//case时需要用到unapply方法;如果是case类的话,编译会自动生成apply和unapply方法
    greet match {
      case Greet(name, age) => println("name: " + name + "; age: " + age)
      case _ => println("sorry...")
    }

    val greet1 = Greet.apply
    greet1 match {
      case gt: Greet => println("name: " + gt.name + "; age: " + gt.age)
      case _ => println("sorry...") 
    }
  }
}

用法二:应用在工厂模式

trait Animal {
  def speak(name: String): Unit
}

class Dog extends Animal {
  override def speak(name: String): Unit = {
    println("This is a dog, is's name: " + name)
  }
}

class Cat extends Animal {
  override def speak(name: String): Unit = {
    println("this is a cat, is's name: " + name)
  }
}

object Animal {

  def apply(animalType: String): Animal = {
    animalType.toLowerCase match {
      case "cat" => new Cat
      case "dog" => new Dog
      case _ => throw new IllegalArgumentException()
    }
  }
}

测试方法:

object ApplyTest {
  def main(args: Array[String]): Unit = {
    Animal("Dog").speak("wangwang")
    Animal("cat").speak("miaomiao")
  }
}

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值