エレガントなテンプレートを求む
アルバイト先の企画で、Javaのペアプログラミングを実践した。
数人とペアプログラミングをし、各々のEclipse使いっぷりをアピールしあったのだが
テンプレート機能について知らない人が多かったので、共有したいという願いをこめてメモしておく。
テンプレートとは
テンプレートとは、定型文を入力する機能で、
使える場所でテンプレート名を(途中まで)入力して、コード補完Ctrl + O(12/14修正)Ctrl + Spaceで呼びだせる。
テンプレートの設定
Window -> Preferenceメニューから
ツリーでJava -> Editor -> Templatesで自分でテンプレートを定義したり、インポート/エクスポートすることができる。
テンプレートの使い方
一般的には、コードの重複はメンテナンスが悪くなるため
テンプレートで貼りつけるよりも、関数、メソッドで抽象化するのがよい (DRY原則)。
しかし、Javaのお決まりの作法を入力するのには、テンプレートが便利。
私が頻繁に使う有名なテンプレートは、
- main
- sysout
- for
- foreach
あたり。
- main
public static void main (String[] args){ }
Java初心者が恐れることで名高い「おまじない」。
Javaプログラムのエントリポイントを一瞬で作ってくれる。
クラスを作るときのダイアログで作ることもできるが、
Javaプログラムとして想定していなかったクラスのメソッドを実行したくなったときに便利。
- sysout
ご存じ標準出力へのプリント
System.out.println();
を一瞬で書ける。
いわゆるprint(f)デバッグに使う。
- for
3種類あるが、iterate over array with temporary variableは
配列の繰り返しに非常に便利。
たとえば、
int[] nums = new int[10];
と配列を作ってから直後にforを呼びだすと、
int[] nums = new int[10]; for (int i = 0; i < nums.length; i++) { int j = nums[i]; }
ここまでやってくれる。
- foreach
コレクションの繰り返しに非常に便利。
たとえば、
Set<Integer> numSet = new HashSet<Integer>();
とSetを作ってから、直後にforeachを呼びだすと
Set<Integer> numSet = new HashSet<Integer>(); for (Integer integer : numSet) { }
ここまでやってくれる。デフォルトの変数名が長いのが難点。Tabで変数名を選択し、書き換えましょう。
テンプレート応用
私がよく定義するテンプレートはこんな感じ。
よく定義するのが問題なのだが。
- 例外のスロー
こんなやつ。
throw new RuntimeException(${cursor});
テンプレートに「runtime」など例外の名前をつけておくと、throw newをタイプする手間が省ける。
同じ種類の例外を頻繁に投げる場合に便利。
- SeasarのImplicit Component
http://s2container.seasar.org/2.4/ja/DIContainer.html#ImplicitComponent
HttpServletRequest request; HttpServletResponse response;
などを宣言して、setterを定義すると「自動的にDIされます」。
逆に変数名を間違えるとDIされないので、テンプレートで入れたいところ。
(5/7 r_ikedaさんのコメントで解決)
ただしテンプレートではクラスがインポートされないので、Ctrl + Shift + Oでインポートの編成をする必要がある。
またsetter生成が必要。setterも含めてテンプレートにするべし。
- n回繰り返し
こんなやつ。
for (int ${index} = 0; ${index} < ${cursor}; ${index}++) { }
RubyのInteger.timesメソッド。
以前Iterableを実装することで実現できた
http://d.hatena.ne.jp/kya-zinc/20090222/1235278976
(Range.timesメソッドとforeach)
が、Javaプログラマにはこちらの方が読みやすいかもしれない。
テンプレート探し
少し検索してみたらすぐに使えそうなものを発見。
「文字列がnullでも空でもない」なるほど。
http://d.hatena.ne.jp/r_ikeda/20090326/template
コピペではなく、テンプレートを共有しましょう!
(5/6更新)
http://eclipsewiki.net/eclipse/?%A5%C6%A5%F3%A5%D7%A5%EC%A1%BC%A5%C8
が詳しい。