gpt4 book ai didi

scala - 带字符串内部类型的值类?

转载 作者:行者123 更新时间:2023-12-01 11:21:41 25 4
gpt4 key购买 nike

给定以下函数:

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 个值类,使用它们比 case class 有什么好处?的?

最佳答案

值类并不意味着提供一种方法来进行堆栈分配而不是堆分配。这通常是您无法控制的。相反,它们旨在防止在创建“包装器”类时会发生额外的对象分配。

在您的情况下 Firstname , 延伸 AnyVal意味着当你做类似的事情时

val x = new Firstname("Bob")

没有 FirstName 的实例实际创建和 x实际上只是一个 String在运行时(假设您没有做文档描述的会强制分配的事情之一,例如模式匹配)。但绝不是 AnyVal改变包裹方式 String得到分配。

关于scala - 带字符串内部类型的值类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41786690/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com