クラス

クラスは Java と同様に class キーワードで定義します。

class Book {
  val title = "Scala"
  def printTitle() = println("Title:" + title)
}

object Main extends Application {
  val b = new Book()
  b.printTitle() //Title:Scala
}

上記クラスをよりScalaっぽくすると、以下のようになります。

class Book(title:String) {
  def printTitle() = println("Title:" + title)
}

object Main extends Application {
  val b = new Book("Scala")
  b.printTitle()
}

クラスはパラメータを受け取ることができ、これがクラスのインスタンス変数として扱われます。クラスの定義が関数定義のように引数を受け入れます。

上記のBookを以下のように呼び出すと、タイトルにnullが設定されます。

  val b = new Book(null)
  b.printTitle()  //Title:null

さて、このような場合は、以下のようにしてタイトルにnullが設定されないようにすることができます。

class Book(title:String) {
  if (title == null) {
    throw new NullPointerException("titel was null")
  }
  def printTitle() = println("Title:" + title)
}

object Main extends Application {
  val b = new Book(null)
  b.printTitle()  //NullPointerExceptionが発生!!
}


初期化時に処理を行う場合は以下のようにコンストラクタを定義できます。

class Book(title:String, count:Int) {
  def this(title:String) = this(if (title==null) "none" else title, 0)
  def printTitle() = println("Title:" + title + "  count:" + count)
}

object Main extends Application {
  val b1 = new Book("Scala", 3)
  b1.printTitle()  //Title:Scala  count:3

  val b2 = new Book("Java")
  b2.printTitle()  //Title:Java  count:0

  val b3 = new Book(null)
  b3.printTitle()  //Title:none  count:0
}