我有以下两个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的不同调用功能?
答案 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