使用Factory Pattern防止Scala中的类实例化

时间:2015-06-15 02:36:23

标签: scala factory-pattern

假设我在Scala中定义了以下类:

class ClassA(val n: Int) {
   ...
}

我想将此类实例限制为仅使用Factory Pattern将 n 介于5到10之间的类实例。例如,如果我写了类似的东西:

val a = new ClassA(11)

这会引发异常并显示相应的错误消息,或者至少返回null或其他内容。我怎样才能实现这种行为?

更新

可以在java with Factory pattern中实现这一点。

UPDATE2:

这个问题似乎得到了回答here,特别是有一个冗长的标题。我调整了标题和内容以保存被删除的问题,原因有两个:1)这个例子很简洁,2)@Chris Martin提供的答案简要解释了Scala中使用的工厂模式的方式伴侣对象。

1 个答案:

答案 0 :(得分:2)

在Scala中编写工厂的传统方法是在配对对象上定义apply方法。

以下是使用Either的示例(因为null在Scala中从不/很少使用,而且异常很难看):

class A private (n: Int) {
  override def toString = s"A($n)"
}

object A {
  def apply(n: Int): Either[String, A] =
    if (n < 5) Left("Too small")
    else if (n > 10) Left("Too large")
    else Right(new A(n))
}

A(4)  // Left(Too small)
A(5)  // Right(A(5))
A(11) // Left(Too large)

这与您引用的Java示例基本相同。 A构造函数是私有的,因此只能通过工厂方法实例化该类。