创建类型别名相对于使用String的好处



我可以看到创建自定义类型比使用字符串有以下几个好处:

type UserId = String
def getUser(userId: UserId)...

def getUser(userId: String)...

它使您的代码更具可读性,我想如果您需要将类型从String更改为Int,它将使重构更容易。

还有什么其他好处?

虽然在某些情况下使用type可以提高可读性,但如果您使用它来创建别名,则不会使您的代码更安全或更容易重构。考虑:

type A = String
def m(s: A) = s.length
m("12345") // It's "safe" to use String instead of A

如果你想要一个包装器,这样你就不会传递用户名(两个字符串)的用户登录,你可以使用一个值类:

class UserName(val name: String) extends AnyVal
def m(name: UserName) = name.name.length
m("12345") //> error: type mismatch
m(new UserName("12345")) //> 5

值类占用空间非常小,实际上它们直接操作其底层对象。如果你看一下生成的代码,它实际上是:

def m(name: String): Int = name.length();
m("12345")

type在需要创建类型表达式时发挥作用,例如:

type ¬[A] = A => Nothing
type ¬¬[A] = ¬[¬[A]]
type ∨[T, U] = ¬[¬[T] with ¬[U]]
type |∨|[T, U] = { type λ[X] = ¬¬[X] <:< (T ∨ U) }

(我想到的第一件事,归功于Miles Sabin)

当您构建自己的库时,您希望公开良好的DSL来使用您的库。有时通过隐式来创建中缀操作符。您可以查看:中缀操作符

当你为你的类型创建隐式时,它不会发生在String上,除非你将String转换为你的类型。

值是多少?使用隐式时的安全性。

相关内容

最新更新