我正在考虑制作一个值类,该类对如何实例化它有一些保护措施。举个例子,假设我想要一个非负整数:
class NonNegInt private (val value: Int) extends AnyVal
object NonNegInt {
def apply(value: Int): Try[NonNegInt] = Try {
if (value >= 0) new NonNegInt(value) else throw new IllegalArgumentException("non-negative integers only!")
}
}
我唯一担心的是私有(private)构造函数可能使 scala 编译器无法将 NonNegInt
视为原始 int
。这是真的吗?
最佳答案
如果这里的“视为原语”意味着“避免分配”,那么这确实行不通,但不是因为私有(private)构造函数。
如 Value Classes Guide 中所述
此规则的另一个实例是将值类用作类型参数。例如,即使是对身份的调用,也必须创建实际的 Meter 实例。
def identity[T](t: T): T = t
identity(Meter(5.0))
基本上,因为 identity[T] 是参数化的,所以在值类型上调用它需要分配一个实例。 Try[T] 是相同的情况:Try { ... }
"block"是参数化函数 Try.apply[T]
的调用,其中 T 是 NonNegInt
。此调用将需要分配 NonNegInt
实例。
关于scala - 在值类上使用私有(private)构造函数是否会抵消值类的好处?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27711532/