使用工厂模式防止类的实例在Scala中[复制](Preventing a class instant

2019-10-23 09:36发布

这个问题已经在这里有一个答案:

  • 如何检查构造函数的参数,并抛出一个异常,或者使断言在斯卡拉默认构造函数? 2个回答

假设我在斯卡拉定义了以下类:

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

我想这个类的实例限制为只有那些有n个 5至10之间使用工厂模式。 例如,如果我写的东西,如:

val a = new ClassA(11)

这就提出了相应的错误消息的异常,或至少它返回null或东西。 我怎样才能实现这种行为?

更新:

这是可能在java实现这一带工厂模式 。

UPDATE2:

这个问题似乎是回答在这里 ,虽然,特别是有一个详细的称号。 我调整标题和内容保存被删除的问题,有两个原因:1)在这一个例子是简洁的,2)@克里斯·马丁提供的答案简单解释的方式工厂模式可以在Scala中通过使用达到同伴对象。

Answer 1:

写Scala中的一个工厂的传统方法是定义一个apply的同伴对象上的方法。

下面是使用的例子Either (因为null是从未/很少在斯卡拉使用,例外的是丑陋的):

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构造函数是私有的,所以类只能通过工厂方法实例化。



文章来源: Preventing a class instantiation in Scala using Factory Pattern [duplicate]