我希望在我的 Scala 代码中拥有类型安全的原语“子类”,而不会受到装箱性能的影响(对于延迟非常低的应用程序)。例如,这样的事情:
class Timestamp extends Long
class ProductId extends Long
def process(timestamp: Timestamp, productId: ProductId) {
...
}
val timestamp = 1: Timestamp // should not box
val productId = 1: ProductId // should not box
process(timestamp, productId) // should compile
process(productId, timestamp) // should NOT compile
有一个去年 Scala 用户邮件列表上的帖子 http://scala-programming-language.1934581.n4.nabble.com/typedef-like-like-syntax-for-strong-typing-keys-td1956375.html这似乎得出结论,如果没有装箱,这是不可能的,但我想知道现在在 Scala 2.8 中这是否可能。
为什么不使用类型别名呢?我知道它们并不完美(即它们不能解决您的编译问题),但它们可以使您的代码更清晰而不影响性能?
type Timestamp = Long
type ProductId = Long
然后你可以编写使用以下方法拉皮条我的图书馆模式并让 JVM 使用转义分析来消除运行时开销:
class RichTimestamp(self: Timestamp) {
//whatever you want here
}
请注意,所有常见的警告都适用:除非您非常确定(例如,因为您正在进行超低延迟编程),否则使用盒装类型的性能影响可能不是问题。我每天处理的系统处理数千万个输入,没有任何问题!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)