ScalaでC#のプロパティみたいなものを書きたい

書いてみます。

プロパティ

ここで言う「プロパティ」とは、getter/setterを綺麗に書くためのC#の機能です。たとえば、複数個の要素を含む独自のコンテナクラスを作成し、それが空かどうかを判別するための方法を実装したいと思ったとします。

class SomeContainer{
// .....
public boolean IsEmpty { get { return this.size = 0;} }
}

// 使うとき
if(container.IsEmpty)
{
   //....
}

sizeがゼロかどうかで判断すればいいのですが、「sizeが0である」という条件を書くよりもIsEmptyと書いたほうがより明確にやりたいことをはっきりと表現できます。さらに、括弧を書かなくても良い。簡潔です。これは良いことだと思います。

ちなみに、C#ではこれはシンタックスシュガーで、コンパイル時に普通のメソッドに変換されます。

Scalaではどう書くか

Scalaでは何も考えず普通にメソッドを定義してしまえばよいです。引数を取らない関数の括弧は省略できるのでC#と全く同じ表記が可能です。さらに、定義はC#よりも簡潔かつ直観的に書けます。

class SomeContainer{
// .....
def isEmpty = this.size = 0

// 使うとき
if(container.isEmpty)
{
   //....
}

簡単。

ちなみに、setterも必要な場合は_=で終わる特殊な名前のメソッドを用意します。

class Person(private var _name: String) {
def name = _name
def name_=(aName: String) { _name = aName + " san" }
}

val p1 = new Person("nobita")
p1.name  // "nobita"
p1.name = "doraemon"
p1.name  // "doraemon san"

こっちはちょっと面倒な気がします。しかし、setterで何か特殊な処理が必要という場面はあまりない(たぶん)ので気にならないですかね…。たぶん。