有人可以在书中解释下面的例子" Scala编程"由Martin Odersky撰写,涉及使用特征修改界面。
trait HashCaching {
private var cachedHash: Int = 0
private var hashComputed: Boolean = false
/** Override the default Java hash computation */
override def hashCode = {
if (!hashComputed) {
cachedHash = super.hashCode
hashComputed = true
}
cachedHash
}
}
但是,尝试使用它会遇到问题:
class Book(val author: String, val title: String) extends Ordered[Book] with HashCaching {
// compare and equals() as before...
override def hashCode = {
Thread.sleep(3000) // simulate a VERY slow hash
author.hashCode + title.hashCode
}
}
此版本未缓存其哈希码!问题是Book的 hashCode方法重写HashCaching。
Q.1我无法理解为什么哈希码不会被缓存?
然后作者继续给出以下解决方案:
abstract class BaseBook(val author: String, val title: String) {
override def hashCode = {
Thread.sleep(3000)
author.hashCode + title.hashCode
}
}
class Book(author: String, title: String) extends BaseBook(author, title) with Ordered[Book] with HashCaching {
// compare and equals() as before...
}
Q.2如何在基类效果中覆盖哈希码,现在哈希码被缓存了?
在这个例子中我什么都听不懂,请解释一下。
答案 0 :(得分:1)
你回答了它上面的“Q1”:“问题是Book的hashCode方法覆盖了HashCaching。”你混合HashCashing
,然后覆盖实现,所以它最终永远不会被使用。
在另一个示例中,实施由BaseBook
提供,然后由HashCaching
覆盖,增强它,然后由Book
继承。在这种情况下,Book
不会覆盖实现,因此,它可以按预期工作。