Scala におけるフィールド/プロパティの扱いを調べたんだけど相変わらず Scala 糖衣構文が多すぎる話

Scala におけるフィールド/プロパティの扱いがよくわからなかったので調べてみた結果

Scalaではpublicなフィールドにはアクセサが自動的に定義される。

???

いや、publicなフィールドはフィールドではないのか…という感じなのだが、そんなふうに書かれている記事が多い。

実際のところは、Scalaでアクセス修飾子を付加しない場合はpublicになると書いてあるが、コンパイルするとフィールドはprivateになりフィールド名と同じアクセサが定義される、ということらしい。

明示的にprivateにしたフィールドに対しては、自動生成されるアクセサもprivateになり、アクセス制御ができる。

何でこんな回りくどいことをするかというと、アクセサをフィールドのアクセスと同様に.(ドット)で呼び出せる Scala 大好き特殊記法・糖衣構文を作っておくことで、

class Hoge {
  var name: String = _
}

val hoge = new Hoge
hoge.name = "Taro"
println(hoge.name)

というコードで、値をセットする際に入力文字列の最後に.を付加したくなった場合

class Hoge {
  private var name_ : String = _
  def name = name_  // getterにはもとのフィールド名を定義してプロパティを返す
  def name_= (aName: String) { name_ = aName + "."} // setterにはもとのフィールド名+"_="をくっつけたメソッドを定義する
}

//クライアントコードは変更する必要が無い
val hoge = new Hoge
hoge.name = "Taro"  // 実際にはsetterが呼び出されている
println(hoge.name)  // 実際にはgetterが呼び出されている

上記の通り、setterは フィールド名 + “_=” という特殊なメソッド名を指定する。

そんなん初見でわかるか!?

たしかにクライアントコードを変更せずに済むのでライブラリ設計者としては気軽に修正ができるし、利用者側もフィールドと同様の感覚でアクセスできるので便利だと思うのだが、そもそもミュータブルなフィールド/プロパティに直接アクセスるような設計をScalaで利用することがあるんだろうか…

参考:
ScalaでC#のプロパティみたいなものを書きたい
[Scala]アクセッサの定義

広告

Scala におけるフィールド/プロパティの扱いを調べたんだけど相変わらず Scala 糖衣構文が多すぎる話」への1件のフィードバック

  1. > そもそもミュータブルなフィールド/プロパティに直接アクセスるような設計
    DSLとかでしょうか。
    あまりロジックの方には使いたくはありませんね。

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中