2016-04-01 9 views
2

私は、主なコンストラクタがコンマで区切られた文字列として "friends"を取るScalaのcaseクラスを持っています。セカンダリ(オーバーロードされた)コンストラクタは "friends"をArray [String]として受け取り、プライマリコンストラクタを呼び出します。何らかの理由で、プライマリコンストラクタの "friends"はStringでなければならず、オーバーロードされたコンストラクタではArray [String]でなければなりません。Scalaは、オーバーロードされたコンストラクタに 'this'以外のステートメントを持たせることができますか?

mkStringを呼び出す前に友人がヌルかどうかチェックする必要があると思いますが、 "if" statmentを使ってチェックしようとしましたが、コンパイルして友人を配列として再認識していないようです私はisEmptyを呼び出すことを許可していないので、スカラーは "?:"演算子と似ているので、一次コンストラクターの呼び出し内で友人をチェックできますか?

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

エラーメッセージは何ですか? –

+0

エラーメッセージは 'これは予想されますが、'が見つかった場合です。 – jlp

答えて

1

if-else Scalaの条件式は、Javaなど他の従来の言語とは異なり、値を生成します。あなたはまだthisがセカンダリコンストラクタの最初の式であることを確認する必要があります。それは次のようになります。

def this(friends: Array[String]) = 
    this(if (friends != null && !friends.isEmpty) friends.mkString(",") else "") 

を異なるアプローチが受け入れ、Option[Array[String]]または1でそれを自分のラップのいずれかである可能性があり:

def this(friends: Option[Array[String]]) = 
    this(friends.getOrElse(Array.empty[String]).mkString(",")) 
+1

は働いた! – jlp

3

if文は動作するはずです:Scalaではthis(if(friends == null) "" else friends.mkString(","))

Aより多くの慣用的な方法を使用することですOption

" this以外の持つ文" については

this(Option(friends).getOrElse(Array.empty[String]).mkString(","))

、することができますそれらを持っているが、thisがコンストラクターで最初に行う必要があります。これはjavaでも同様です。

+0

これが機能しました。おかげで多くの – jlp

関連する問題