LoginSignup
2
0

More than 5 years have passed since last update.

[Scala] 中括弧でオブジェクトの初期化

Posted at

ScalaでJavaFXを使おうとしたときに、Javaとの互換性問題にあたりました。
builderパターンを使ったNodeオブジェクトの生成がScalaではコンパイルエラーになるのです。調べたところ、JIRAにはすでに報告されていてScala 2.11-M3が修正のターゲットになっているようでした。
https://issues.scala-lang.org/browse/SI-6169

ちなみに、builderパターンを使わずに、中括弧を用いてオブジェクトを初期化することができます。

new Rectangle {
  setWidth(100d)
  setHeight(200d)
  setFill(Color.RED)
  setStroke(Color.GOLD)
}

C#のオブジェクト初期化子に似ていますが、もっと柔軟性が高いです。
この中括弧の中で変数を定義することもメソッドの呼び出しもできます。
もっといえばメソッドの定義すらできます。

new Rectangle {
  val w = 100d
  val h = 200d
  def getColor(n: Int): Color = n match {
    case n if n > 0 => Color.RED
    case _ => Color.GOLD
  }
  setWidth(w)
  setHeight(h)
  setFill(getColor(0))
  setStroke(getColor(1))
}

ただし、これらには注意点もあって、型としてはRectangleではなくてRectangleを継承した匿名クラスを生成しています。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0