§Play エンハンサ
Play エンハンサ は、Java Bean に getter と setter を生成し、これらのフィールドにアクセスするコードを getter と setter を使うよう書き換える sbt プラグインです。
§動機
Java に対するよくある批判のうちのひとつは、単純なことにも大量のボイラープレートコードを要求されることです。もっとも顕著な例はフィールドのカプセル化です - メソッド内のフィールドアクセスと状態変更をカプセル化することは、将来的にデータのバリデーションや生成を可能とするため、よいプラクティスと見做されます。これは、Java では全てのフィールドを private として、フィールドごとに getter と setter を書くことを意味するので、典型的なフィールドごとに 6 行のオーバーヘッドとなります。
それだけではなく、例えば ORM のようにオブジェクトのプロパティにリフレクションを使ってアクセスする多くのライブラリが、クラスのフィールドごとに getter と setter が実装されていることを要求します。
Play エンハンサは、getter と setter を手作業で実装する代わりとなる機能を提供します。コンパイルされたクラスのバイトコードに対するいくつかの後処理を実装しており、これは一般的にバイトコード拡張と呼ばれています。Play は、クラス内のすべての public フィールドに対する getter と setter を生成し、これらのフィールドを使うコードを生成した getter と setter を使うように書き換えます。
§欠点
しかしながら、getter と setter を生成するバイトコード拡張にも欠点はあります。以下に数点、示します:
- バイトコード拡張は不明瞭であり、生成された getter と setter を目にすることはないので、なにかがおかしくなったときに何が起こっているのか理解し、デバッグするのが難しくなります。このような理由から、バイトコード拡張ははしばしば “魔法” と言われています。
- IDE のようなツール類は、最終的に利用されるバイトコードを認識していないので、バイトコード拡張はこれらツールの操作を妨げてしまいます。このことは、バイトコード拡張に依存しているソースコードのテストを IDE 内にて実行する場合に、IDE がコンパイル時にバイトコードエンハンサを実行しないためにテストが失敗するなどのような問題を引き起こします。
- コードベースに不慣れな従来の Java 開発者は getter と setter が生成されることを予期しておらず、混乱を引き起こすでしょう。
Play エンハンサを使うか否かはプロジェクト次第ですが、もし使うと決断した場合は、エンハンサが何を行い、どのような欠点がありえるのかを理解することが、もっとも重要です。
§セットアップ
バイトコードエンハンサは、以下の行を project/plugins.sbt
ファイルに追記するだけで有効になります:
addSbtPlugin("com.typesafe.sbt" % "sbt-play-enhancer" % "1.1.0")
Play エンハンサは、すべてのプロジェクトで有効になります。特定のプロジェクトで Play エンハンサを無効にしたい場合は、build.sbt
ファイルで以下のように設定します:
lazy val nonEnhancedProject = (project in file("non-enhanced"))
.disablePlugins(PlayEnhancer)
例えば、事前にバイトコード拡張による getter と setter の生成が保証されていることを要求する Play の ebean プラグインを使っているときのように、いくつかの状況ではエンハンサプラグインを無効にすることができないかもしれません。このような状況で getter と setter を生成したくない場合は、playEnhancerEnabled
設定を使うことができます:
playEnhancerEnabled := false
§操作
エンハンサは、以下に該当する Java クラスの全フィールドを探します:
- public で
- static ではなく
- final ではない
これらのフィールドについて、もし getter と setter が既に存在していなければ、エンハンサが生成します。フィールドに対して特別な getter または setter を提供したい場合、ただ実装しておけば、Play エンハンサは既に存在している getter または setter の生成を単にスキップします。
§設定
バイトコード拡張されるファイルを正確にコントロールしたい場合は、playEnhancerGenerateAccessors
と playEnhancerRewriteAccessors
タスクに souces
タスクスコープを設定することができます。例えば models パッケージ内の java ソースだけ拡張する場合は、以下のようになるでしょう:
sources in (Compile, playEnhancerGenerateAccessors) := {
((javaSource in Compile).value / "models" ** "*.java").get
}
Next: リバースルートの統合
このドキュメントの翻訳は Play チームによってメンテナンスされているものではありません。 間違いを見つけた場合、このページのソースコードを ここ で確認することができます。 ドキュメントガイドライン を読んで、お気軽にプルリクエストを送ってください。