Scala和隐式类实例化

时间:2014-11-27 05:27:08

标签: scala implicits

我有以下两个Scala文件:

object ImplicitsHome {
  implicit class StringWrapper(val str: String) extends ImplicitsHome with Serializable
}


trait ImplicitsHome {
  def str: String

  def embelishString: String = {
    str.concat("fancy")
  }
}

import ImplicitsHome._

class User {

  def buildSuperString(str: String): String =   {
    str.embelishString
  }
}

object User {
  def main(args: Array[String]): Unit = {
     val usr = new User()
     val fancy = usr.buildSuperString("hi")
     println(fancy)
  }

}

我想知道的是,如果我不得不多次调用embelishString函数,我是否会创建隐式StringWrapper类的多个实例?

我很担心这个,因为当使用隐式时,它会传递一个字符串(str) - 它是'状态',我必须小心分享{{1的不同调用功能?

1 个答案:

答案 0 :(得分:1)

每次致电embelishString时,都会创建StringWrapper的新实例。如果你没有一个沉重的构造函数/状态用于隐式类,它通常你不会(空构造函数和指向某些String的指针 - 在你的情况下对象,它非常便宜)。所以没有理由担心。除此之外 - String是不可变的(以及StringWrapper) - 这意味着您无论如何都不应该担心共享状态。

示例:

 scala> implicit class Aaa(a: String) {println(a); def aa = 5} //added println to constructor
 defined class Aaa


 scala> "aaa".aa; "aaa".aa; "bbb".aa
 aaa //first instantiation (for "aaa".aa)
 aaa //first instantiation (for another "aaa".aa)
 bbb //third instantiation (for "bbb".aa)
 res4: Int = 5