如何纠正Scala构造函数的错误参数?

时间:2018-08-20 19:18:07

标签: scala constructor nullable

我有一个Scala类,如下所示:

class MyClass(title: String, value: Int) {
   ...
}

如果用title的{​​{1}}值调用构造函数,我想将null设置为空字符串。我怎样才能做到这一点?除了强制title私有并提供吸气剂之外,还有没有更清洁的方法?

title

3 个答案:

答案 0 :(得分:3)

您可以创建提供所需值的工厂方法。通常,在Scala中,这是在伴随对象中完成的:

object MyClass {
  def apply( title: String, value: Int ): MyClass =
    new MyClass( if (title == null) "" else title, value)
}

答案 1 :(得分:1)

Scala鼓励您使用Option,其中值可以为“ none”,而不是使用需要不断检查if-not-null的可空变量。 实现此目的的一种方法是使用辅助构造器:

class ClassX(title: Option[String]) {
  def this(title: String) {
    this(Option(title))
  }
}

如果必须使用可为空的变量,则可以使用上述工厂。

答案 2 :(得分:1)

就目前而言,您的title值只是一个构造函数参数,因此无法从外部访问(是否省略了val?)。您可以使用此事实来计算实际的title成员,如下所示:

class MyClass(_title: String, val value: Int) {
  val title = if (_title == null) "" else _title
  ...
}

这保证在任何title实例中null都不是MyClass


为完整起见,这是工厂方法的替代实现:

trait MyClass {
  def title: String
  def value: Int
}

object MyClass {
  protected class MyClassImplementation(val title: String, val value: Int) extends MyClass {}

  def apply(title: String, value: Int) =
    new MyClassImplementation(if (title == null) "" else title, value)
}

创建MyClass实例的唯一方法是通过factory方法,因此总是调用null检查。