ScalaでBeanを作ってみよう。
http://itpro.nikkeibp.co.jp/article/COLUMN/20080820/313059/?ST=develop
にあったPersonクラスがちょうど良さげなのでパクる。
まずはJavaBeanの場合。
うわなげえキモイ。
Scalaで書くとこう。
うーんシンプル。
まずScalaではクラス名に続けて引数を書くみたいにコンストラクタを書ける。
コンストラクタの引数はレキシカル変数としてval宣言される。
なので外部からはアクセスできないけれど、クラス内からはそのままアクセスできる。
変更できないけど。
そしてインスタンス変数はデフォルトpublicな扱い。
なのでアクセッサーないけど直接.firstName =~みたいにアクセスする。
というかこれをアクセッサーと考えてよいみたい。
あとコンストラクタのオーバーロードはthis関数を定義してやる。
ちなみにこういうBean的なクラスであれば、コンストラクタ引数そのままクラスメンバでよくね?
ってなる。そしてそういう書き方ができる。
いいねえ。
実際に使ってみる。
インスタンスをval宣言しているけど、内部メンバのfirstName自体はvar変数なので値を変更できている。
このへんが手続き型っぽいところ。
あと、二回目のprintlnでは.を省略して呼び出してみた。
Beanといえばそのまんまだとprintlnしても中身がわからないので
Java屋さんならtoStringしたくなるところ。
JavaでいうObjectに対応する、Scalaでのすべてのクラスの基底クラスとしてAnyクラスってのがあるらしい。これまたtoStringを持っているので、Javaのときと同じようにtoStringをオーバーライドしてやればよい。
Scalaでオーバーライドしたいときは、アノテーションとかそういう生易しいものではなく
overrideって修飾子をつけなきゃならないんだって。やりましたね!
http://itpro.nikkeibp.co.jp/article/COLUMN/20080820/313059/?ST=develop
にあったPersonクラスがちょうど良さげなのでパクる。
まずはJavaBeanの場合。
public class JavaPerson {
private String firstName;
private String lastName;
private JavaPerson spouse;
public JavaPerson( String firstName,
String lastName,
JavaPerson spouse ){
this.firstName = firstName;
this.lastName = lastName;
this.spouse = spouse;
}
public JavaPerson( String firstName,
String lastName ){
this(firstName, lastName, null);
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public JavaPerson getSpouse() {
return spouse;
}
public void setSpouse(JavaPerson spouse) {
this.spouse = spouse;
}
}
うわなげえキモイ。
Scalaで書くとこう。
class ScalaPerson(fn:String,ln:String,sp:ScalaPerson){
var firstName = fn
var lastName = ln
var spouse = sp
def this(fn:String, ln:String) =this (fn, ln, null)
}
うーんシンプル。
まずScalaではクラス名に続けて引数を書くみたいにコンストラクタを書ける。
コンストラクタの引数はレキシカル変数としてval宣言される。
なので外部からはアクセスできないけれど、クラス内からはそのままアクセスできる。
変更できないけど。
そしてインスタンス変数はデフォルトpublicな扱い。
なのでアクセッサーないけど直接.firstName =~みたいにアクセスする。
というかこれをアクセッサーと考えてよいみたい。
あとコンストラクタのオーバーロードはthis関数を定義してやる。
ちなみにこういうBean的なクラスであれば、コンストラクタ引数そのままクラスメンバでよくね?
ってなる。そしてそういう書き方ができる。
class ScalaPerson( var firstName:String,
var lastName:String,
var spouse:ScalaPerson ){
def this(firstName:String, lastName:String) = {
this(firstName:String, lastName:String, null)
}
}
いいねえ。
実際に使ってみる。
object TestMain{
def main(args:Array[String]){
val p = new ScalaPerson("六郎", "岡島")
println(p.firstName)
p.firstName = "八郎"
println(p firstName)
}
}インスタンスをval宣言しているけど、内部メンバのfirstName自体はvar変数なので値を変更できている。
このへんが手続き型っぽいところ。
あと、二回目のprintlnでは.を省略して呼び出してみた。
Beanといえばそのまんまだとprintlnしても中身がわからないので
Java屋さんならtoStringしたくなるところ。
JavaでいうObjectに対応する、Scalaでのすべてのクラスの基底クラスとしてAnyクラスってのがあるらしい。これまたtoStringを持っているので、Javaのときと同じようにtoStringをオーバーライドしてやればよい。
class ScalaPerson( var firstName:String,
var lastName:String,
var spouse:ScalaPerson ){
def this(firstName:String, lastName:String) = {
this(firstName:String, lastName:String, null)
}
override def toString = {
val s = () => spouse match {
case null => ",配偶者なし"
case _ => ",配偶者:" + spouse.toString
}
"性:" + lastName + ",名:" + firstName + s()
}
}
Scalaでオーバーライドしたいときは、アノテーションとかそういう生易しいものではなく
overrideって修飾子をつけなきゃならないんだって。やりましたね!