Scalaのプライマリーコンストラクタとアディショナルコンストラクタについて

Scalaのプライマリーコンストラクタ(primary constructor)とアディショナルコンストラクタ(additional constructors)についてメモ

目次
・プライマリーコンストラクタについて
・アディショナルコンストラクタについて
インスタンスフィールドを公開するには

・プライマリーコンストラクタについて

まずはプライマリーコンストラクタについて

scala> class Iphone5c( color:String, price:Int ){
     |    def iphoneColor = println("color is " + color)
     | }

プライマリーコンストラクタは上のように(引数名1:型, 引数名2:型)指定する。

・アディショナルコンストラクタについて

今度はアディショナルコンストラクタについて
2つ目以降のコンストラクタはdef this(引数)という風に記述する

scala> class Iphone5c( val color:String, val price:Int ){
     |    def this( color:String ) = this( color, 500)
     |    def iphoneColor = println("color is " + color)
     | }
defined class Iphone5c

scala> val hikosIphone5c = new Iphone5c( "blue" )
hikosIphone5c: Iphone5c = Iphone5c@721e0f4f

scala> hikosIphone5c.price
res1: Int = 500

scala> hikosIphone5c.color
res2: String = blue

注意しないといけない点は2つあって、
1つ目はアディショナルコンストラクタは先頭で、自分よりも前に定義された別のコンストラクタを呼び出す必要がある。
2つ目はプライマリコンストラクタか前に記述されているアディショナルコンストラクタのどちらかを呼び出さないといけない。

なので↓のようなことをしたらerrorが表示されます。

scala> class Iphone5c( val color:String, val price:Int ){
     |    def this( color:String ) = {
     |        println("abc")
<console>:3: error: 'this' expected but identifier found.
              println("abc")
              ^

インスタンスフィールドを公開するには

まずは例から、

scala> class Iphone5s( color:String, price:Int ){
     |    def iphoneColor = println("color is " + color)
     | }
defined class Iphone5s

scala> val myIphone = new Iphone5s("yellow", 600)
myIphone: Iphone5s = Iphone5s@29ee9faa

scala> myIphone.color
<console>:10: error: value color is not a member of Iphone5s
              myIphone.color
                       ^

さっきのiPhone5cの時はインスタンス化した後にcolorやpriceを参照できたのに、今回はerrorが表示されました。
これはコードの違いを確認したらわかると思うのですが、
classの引数の前にval(or var)をつけることで各フィールドに外部からアクセスできるようになります。
クラスのなかでdefを定義してもいいのですが、引数の前にvalを指定してあげるほうがより簡潔な書き方ができるので。

scala> class Iphone5c( val color:String, val price:Int ){


Scala逆引きレシピ (PROGRAMMER’S RECiPE)

Scala逆引きレシピ (PROGRAMMER’S RECiPE)

Scala実践プログラミング―オープンソース徹底活用

Scala実践プログラミング―オープンソース徹底活用

Scalaスケーラブルプログラミング第2版

Scalaスケーラブルプログラミング第2版