假设我在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中使用的工厂模式的方式伴侣对象。
答案 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
构造函数是私有的,因此只能通过工厂方法实例化该类。