fluent interface呼び出し書式を正しくeclipse3.6でフォーマットする方法

Java言語のコードの書式のひとつとして、fluent interface(流れるような*1インターフェース)という書き方が知られています。
http://capsctrl.que.jp/kdmsnr/wiki/bliki/?FluentInterface
構文的にはSmalltalkのようにメソッドの戻り値にメッセージ送信対象のオブジェクトを返却することで、一文で複数のメソッド呼び出しを行うという書き方です。以前、多くの日本人がオブジェクト指向プログラミングを苦手とするのは英語アレルギーだからか? - 達人プログラマーを目指してで書いたように、英語脳になってないと必ずしもうれしくないこともありますが、英語の得意な外国人にとっては自然言語のように分かりやすく簡潔に記述できることもあり、最近のAPIでは結構流行しているようです。厳密にはFluentではないかもしれませんが、形式上チェーンで呼び出す書式はJPAでもQueryを生成する際に一部採用されていますね。

return em.createNamedQuery("Customer.findCustomersByAccountNo")
	.setParameter("accountNo", accountNo)
	.setParameter("userId", userId)
	.getResultList();

この形式を使う場合、必ず個々のメソッドの呼び出しが新しい行に改行されるようにフォーマットすることが大切です。そうしないとデバッグが困難となります。個人的には簡潔に表現できることもあって、このチェーン呼び出し形式は好きなのですが、従来eclipseでフォーマットをかけるとフォーマットが崩れてしまうというのが問題となっていました。チームの開発規約で自動的にフォーマットをかけることを強制しているケースも多いため、やむなくこの記法の採用を見送ったケースも多々あります。何とかならないものかと調べたら、実はeclipse3.6の新機能を使うと上手いことフォーマットができるということがわかりましたのでここで紹介させていただきます。
まず、「ウィンドウ→設定」で設定ダイアログを開きます。次に、左側のツリーで「Java→コード・スタイル→フォーマッター」の順に選択してフォーマッターの設定画面を開きます。

上図のように「行折り返しタブ」を選択し、「関数呼び出し→修飾呼び出し」を選択後、行折り返しポリシーを「必要時以外は最初の要素以外のすべての要素を折り返す」に設定します。お好みにより多少の微調整はありますが、この設定をすることでfluent interface呼び出し書式がフォーマット時に大きく崩れることはなくなります。
なお、eclipse3.6では特定の領域のフォーマットをoffにする機能も追加されています。DSLのような凝ったAPIを使っているフレームワークだと、完全にフォーマッターをoffにしたいことがあります。私がよく問題にしているのはjmockを使った以下のような単体試験のコードですね。

context.checking(new Expectations() {{
	oneOf (taskDao).findBy("test"); will(returnValue(null));
	oneOf (sender).send(StatusEnum.INTERNAL_ERROR);
}});

jmockでは一見Javaでないような特殊な書き方をするので、通常のフォーマッターでは正しく処理できません。こうした場合にフォーマッターoff領域を設定できると非常に便利です。設定は簡単で、先ほどのフォーマッターの設定ダイアログに追加されている「off/onタグ」タブにてチェックを入れるだけです。

なお、このタグをすべて手動で挿入するのは面倒なため、以下のようにテンプレートを追加しておくことをお勧めします。

このようにしておくとコード中で「nf」と入力後Ctrl-スペース(Windowsの標準キーマッピングの場合)を入力すると自動的にタグが挿入されて便利です。
java - How to indent the fluent interface pattern "correctly" with eclipse? - Stack Overflow
を参考にさせていただきました。

*1:一般的にこのように翻訳されるようだが本来的な意味は流暢な、ペラペラなという意味の方が近いと思う。(外国人にとって)自然な英語に聞こえるという意味から来ていると考えられる。