鉴于以下功能:Value Class w/String Inner Type?
def prefixDr(firstName: String, lastName: String): String =
"Dr. " + firstName + " " + lastName
比方说,我决定添加Value Class,切忌混了第一个和最后一个名字,例如:
scala> prefixDr("Doe", "Jane")
res5: String = Dr. Doe Jane // whoops - should've been in reverse order
class FirstName(val value: String) extends AnyVal
class LastName(val value: String) extends AnyVal
,然后使用它们:
def prefixDr(firstName: FirstName, lastName: LastName): String =
"Dr. " + firstName.value + " " + lastName.value
它现在比以前更安全:
scala> prefixDr(new FirstName("Jane"), new LastName("Doe"))
res6: String = Dr. Jane Doe
首先,我理解值类型的动机是避免堆分配,即将值存储在堆栈中,而不是堆;前者访问时间比后者快。据我所知,在上述情况下,我使用了两个String
,它们是AnyRef
的子类型,即java.lang.Object
,它分配给堆。
所以,在上面的例子中,即使用2个Value Classes,使用它们的好处是什么,比使用case class
的好处多多少少?
作为一个方面说明,我想补充一点,它能够在编译删除。因此,你可以在情况下两种方法结束接受两个不同的值类,但它不能编译,因为该方法最终具有相同的签名。 –