1

我最近一直在阅读“Scala by Example”一书,其中作者创建了一个抽象类来表示一组具有两个子类(EmptySet 和 NonEmptySet)的整数“IntSet”,如下所示:

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
}

我的问题是:这种将空容器表示为自己的类而不是创建一个具体类来处理空容器和非空情况的范例有多大用处?

4

1 回答 1

1

每个实现都更简单且更具可读性,因为不必在实现中进行 is-empty-check。这也会导致更好的代码度量值(如圈复杂度)。

此外,它通常使实现稍微快一些,因为空和非空之间的区别不必在运行时完成。据我所知,ScalaSet应用了这种技术并实现了不同类型的集合(根据它们的大小使用)来优化性能。

显然,这仅适用于不可变数据结构。

于 2013-01-07T14:29:45.670 回答