publicフィールドのすすめ?

Javaにおいてはフィールドにアクセスする際に原則として
getter/setterのアクセッサを用意する習慣があります。


カプセル化や拡張性のことを考えるとこれは正しいと思うし
自分も普通はそういう風にコーディングしています。


でも、特定の状況下においてはpublicなフィールドを用意して直接値を取得、代入するのも
アリかなぁと最近は考えています。
特定の状況というのは、例えばSQLで取得した検索結果をフレームワークによって
指定したクラスへ自動マッピングするようなケースです。


マッピングされる側のEntityクラスにはテーブル項目に対応した各フィールドを
用意することが一般的ですが、これらのクラスにはアクセッサをご丁寧に
書く必要が特にないように思います。
フレームワーク側からすれば、リフレクションで命名規則に一致したフィールド、
またはsetterメソッドに値をセットするだけですし。


もちろん、アクセッサ内でデータ加工を行いたいケースもあると思いますが、
その場合は通常どおりprivateフィールドにしてアクセッサを用意すれば良いだけです。
そのまま利用できる値はpublicで、加工が必要な値はアクセッサで、という風に
分ける必要はありますが、逆に開発者がデータ構造を意識することでバグが
少なくなるメリットもあるかもしれません。
(publicでアクセスできない=アクセッサ内で加工している  と気づける)


publicフィールドはSeasar2を参考にさせてもらいましたが実際に使ってみた感想としては、

  1. ソースコードが見やすい
  2. Eclipseでのコード補完が直感的(いちいちgetXxx〜のように探す必要がない)

といったメリットが大きかったですね。


まあ、上記のメリットに魅力を感じないのであれば普通にアクセッサを
書いてくださいというお話です(^^;