我有一个Scala类,如下所示:
class MyClass(title: String, value: Int) {
...
}
如果用title
的{{1}}值调用构造函数,我想将null
设置为空字符串。我怎样才能做到这一点?除了强制title
私有并提供吸气剂之外,还有没有更清洁的方法?
title
答案 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
检查。