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)
- 作者: 竹添直樹,島本多可子
- 出版社/メーカー: 翔泳社
- 発売日: 2012/07/03
- メディア: 単行本(ソフトカバー)
- 購入: 6人 クリック: 54回
- この商品を含むブログ (13件) を見る
- 作者: 小笠原啓,尾崎智仁,関隆,水島宏太,今井敬吾
- 出版社/メーカー: 秀和システム
- 発売日: 2011/06
- メディア: 単行本
- 購入: 2人 クリック: 134回
- この商品を含むブログ (20件) を見る
- 作者: Martin Odersky,Lex Spoon,Bill Venners,羽生田栄一,水島宏太,長尾高弘
- 出版社/メーカー: インプレスジャパン
- 発売日: 2011/09/27
- メディア: 単行本(ソフトカバー)
- 購入: 12人 クリック: 235回
- この商品を含むブログ (45件) を見る