Scala是否允许重载的构造函数具有除此之外的语句?

时间:2016-04-01 15:53:07

标签: scala

我在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 ?
       }
 }

2 个答案:

答案 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(","))