我最近经历过这本书" Scala by Example"其中作者创建了一个抽象类来表示一组int和#34; IntSet"有两个子类(EmptySet和NonEmptySet)如下:
abstract class Stack[A] {
def push(x: A): Stack[A] = new NonEmptyStack[A](x, this)
def isEmpty: Boolean
def top: A
def pop: Stack[A]
}
class EmptyStack[A] extends Stack[A] {
def isEmpty = true
def top = error("EmptyStack.top")
def pop = error("EmptyStack.pop")
}
class NonEmptyStack[A](elem: A, rest: Stack[A]) extends Stack[A] {
def isEmpty = false
def top = elem
def pop = rest
}
我的问题是:这个将空容器表示为自己的类而不是创建一个具体类来处理空和非空案例的范例有多大用处?
答案 0 :(得分:1)
每个实现更简单,更易读,因为不需要在实现中执行is-empty-check。这也会带来更好的代码度量值(如圈复杂度)。
此外,它通常使实现稍快一些,因为空和非空的区别不必在运行时完成。据我所知,Scala的Set
应用了这种技术并实现了不同类型的集合(根据其大小使用)来优化性能。
显然这仅适用于不可变数据结构。