PropertyInterTypeの真意

PropertyInterType の使い方が方々(?)で話題になっているので、作者としてもコメントしておきます。

PropertyInterTypeの目的

今のところの使いどころは、DIのインジェクション用です。つまり、アクションクラスやロジック(サービス)クラスにインジェクションを行うためのSetter、Getterのコーディング量を減らすのが目的といえます。

eclipseじゃだめなの?

たしかに、eclipse等のIDEなら半自動生成できます。しかし、S2JSFを実際の開発で使っていると、アクションやロジックのフィールドの数が結構多くなって半自動生成でも面倒なのと、フィールドによって「あるものはsetterのみ、あるものはgetterのみ、あるいは両方)なんて作り分けが必要になります。そうすると、アクセサの作り分けが結構面倒になってきます。

#「なにも考えずに全てのフィールドにsetter、getterのを両方用意すればいいのでは?」という考え方もあるかも知れません。が、これは意図しない挙動を生む(getだけを意図していたフィールドにsetされたり)可能性があるので、好きではありません。そのそも、それならフィールドをpublicにしておけばよいし。

目に優しい

でね、正直なところですが、アクセサを正しくチェックしたかどうか見てると、目がショボショボしてくるんですよ。

だって、「set○○」と、「get○○」って、一文字しか違わないでしょ(^^;。本当に目が痛くなってくるんですよ。

環境にも優しい

仕事上ではソースコードのレビューとかするときって、やっぱり紙に印刷してみたりするんですが、setter、getterのコードって、場所取りますよね。毎回「無駄だなぁ」って思ってました。PropertyInterTypeを使うことで印刷コストの削減にもつながります。

エンティティオブジェクトに対するPropertyInterType

今のところ、以下のような理由で適用するメリットはほとんどないと思います。

  1. 基本的にはgetter、setterの両方を作るので、それこそeclipseや自動生成ツールでよい
  2. PropertyInterTypeで生成したアクセサメソッドは、リフレクション経由でしかアクセスできないので、ユーザ側で使いにくい(DIのインジェクションは元々リフレクションで行っているので、問題なし)
  3. PropertyInterTypeで生成したメソッドはS2DAOからもアクセスできない。

アノテーションを使うことについて

アノテーションを導入すると、POJOでなくなるのではないか、という議論もあります。たしかにその通りですが、PropertyInterTypeは利用を強制するものではないし、使いたい人が使えば良いと考えています。また、もしPropertyInterTypeを利用したロジッククラスをS2以外のプラットフォームで利用したい場合、@Property アノテーションからsetter、getterのソースコードを自動的に展開するツールなど簡単に作れそうなので、あまり問題にならないでしょう。

便利なら使えばいいじゃないか、というのが私の考え方です。

パフォーマンスについて

id:koichikさんのところでも書かれていますが、インタータイプによるバイトコード生成は、オブジェクトのクラスローディング時に一度だけ行われます。最初の負荷はかかりますが、運用中のパフォーマンス劣化はありません。このあたりがバイトコード生成技術の好きなところです。

http://d.hatena.ne.jp/koichik/20060106#1136575830