我在Scala中有一个案例类,其主要构造函数需要"朋友"以逗号分隔的字符串。辅助(重载)构造函数需要"朋友" as Array [String]并调用主构造函数。出于某种原因,"朋友"在主构造函数中必须是一个String,在重载的构造函数中,它必须是Array [String]。
在辅助构造函数中,我想我需要在调用mkString之前检查朋友是否为null,我尝试使用" if"要检查的状态,但它似乎没有编译和识别朋友作为数组,所以它不允许我调用isEmpty,所以scala有类似的东西"? :"运算符,以便我可以在主要构造函数的调用中检查朋友吗?
case class Person(val friends: String)
{
def this(friends: Array[String]) =
{
if ( !friends.isEmpty)
// doesn't compile, error message: 'this' expected but 'if' found
this(friends.mkString(",") // throw NULL pointer exception
// can I do "this((friends.isEmpty)?"":friends.mkString(","))" here ?
}
}
答案 0 :(得分:3)
if
语句应该有效:this(if(friends == null) "" else friends.mkString(","))
scala中更惯用的方法是使用Option
:
this(Option(friends).getOrElse(Array.empty[String]).mkString(","))
至于“有this
以外的语句”,你可以拥有它们,但this
必须是你在构造函数中做的第一件事。它在java中也是一样的。
答案 1 :(得分:1)
与其他传统语言(如Java)不同,Scala中的if-else
条件表达式会产生一个值。您仍然必须确保this
是辅助构造函数中的第一个表达式。它看起来像这样:
def this(friends: Array[String]) =
this(if (friends != null && !friends.isEmpty) friends.mkString(",") else "")
另一种方法可以是接受和Option[Array[String]]
或用一个自己包装:
def this(friends: Option[Array[String]]) =
this(friends.getOrElse(Array.empty[String]).mkString(","))