凪瀬 Blog
Programming SHOT BAR

目次

Blog 利用状況
  • 投稿数 - 260
  • 記事 - 0
  • コメント - 46860
  • トラックバック - 192
ニュース
広告
  • Java開発者募集中
  • 経歴不問
  • 腕に自信のある方
  • 富山市内
  • (株)凪瀬アーキテクツ
アクセサリ
  • あわせて読みたい
凪瀬悠輝(なぎせ ゆうき)
  • Java技術者
  • お茶好き。カクテル好き。
  • 所属は(株)凪瀬アーキテクツ
  • Twitter:@nagise

書庫

日記カテゴリ

 

Seasarでは命名規約に則ったクラス名のクラスのインスタンスを、同名のフィールドにインジェクションしてくれる機能があります。

public class SampleService {
  /** DIコンテナがインジェクションしてくれるフィールド */
  public HogeLogic hogeLogic;

  public void exec() {
    // メソッド中はインスタンスフィールドにインジェクションされる前提でコードを書く
    this.hogeLogic.hoge();
  }
}

これは命名規約を理解して使っている分には便利なのですが、Eclipseのリファクタリング機能などで クラス名をリネームすると突如動かなくなることがあるので注意が必要です。

上記例で、HogeLogicをPiyoLogicにリネームするとしましょう。HogeLogicのクラス名を選択して、Refactor → rename を選択します。 すると以下のようなバルーンが表示される(以下はEclipse3.4のスクリーンショット。確か3.2以前ではリネームは必ずダイアログでの入力だったはず) ので新しい名前―ここではPiyoLogicとしましょう―を入力します。

すると、Eclipseのリファクタリング機能でクラス名をリネームすると、参照している箇所を網羅的に探してリネームしてくれるため、 プロジェクトの全ソース中でHogeServiceがPiyoServiceに変わります。

この際、クラス名は変更されますが、同名のフィールド名まではリネームしてはくれません。 そのため、SampleServiceでのフィールド宣言は以下のようになります。

  /** DIコンテナがインジェクションしてくれるフィールド */
  public PiyoLogic hogeLogic;

フィールド名が元のままですね。これにより、命名規約違反が生じてうまくインジェクションされなくなります。 コンパイルエラーは起きませんが、実行時にインジェクションを期待したフィールドがnull値となり NullPointerExceptionを発生させることになります。

デフォルトのリネーム操作だとこのような問題が起きるのですが、Eclipseにはフィールド名を含めたリネームがサポートされています。 リネームの際に▼をクリックし、"Open Rename Dialog"とします。(キーボードショートカットのAlt+Shift+Rも活用しましょう)

"Update similarly named variables and methods"にチェックを入れます。 同名の変数とメソッド(getter,setterなど)を更新する、という意味合いですね。 そうすると、以下のように変数名も同時にリネームしてくれます。

public class SampleService {
  /** DIコンテナがインジェクションしてくれるフィールド */
  public PiyoLogic piyoLogic;

  public void exec() {
    // メソッド中はインスタンスフィールドにインジェクションされる前提でコードを書く
    this.piyoLogic.hoge();
  }
}

Seaserなどを利用している場合は、クラス名のリネームの際にはこの点に気を付けて作業しましょう。

投稿日時 : 2008年10月22日 9:45
コメント
タイトル
名前
Url
コメント