EclipseのJavaの全てのコード・テンプレートのまとめ

# テンプレートとは？
EclipseでJavaのコードを書くとき、テンプレートを使えます。
`Ctrl + Space`で呼び出せるやつです。
`sysout`と入力して`System.out.println();`へと変換するテンプレートがもっとも有名です。

# テンプレートを、便利っぽい順番で全て紹介します。

ただし、

* SWT（使う人が少なそう）
* Javadoc（これは`<b></b>`だとかのタグを挿入できるだけなので解説が不要だろう）

は省略してあります。

各紹介項目のタイトルの文言を（途中まで）入力して`Ctrl + Space`で変換できます。
たとえば「foreach」なら、foreachと入力して`Ctrl + Space`です。

環境はEclipse IDE for Java DevelopersのEclipse Luna (4.4.1)です


# 私が普段使っているもの
## foreach
```java
for (int i : array) {
	
}
```
arrayという名前の配列ないしリストを宣言してあると、上のように、そのarrayを自動的に使用してくれます。

forから`Ctrl + Space`で

* 添え字（いわゆる`int i`）を使うfor文
* `Iterator`を使ってコレクションを回すfor文

も作れます。
`Iterator`を使うfor文はこうなります

```java
for (Iterator iterator = collection.iterator(); iterator.hasNext();) {
	type type = (type) iterator.next();
	
}
```

Java8以降はラムダ式を使えるので使用頻度が下がるかもしれませんが、
配列なりリストなりを用意した後にforeachと入力して`Ctrl + Space`を押すだけで使えるので便利です。

## sysout
```java
System.out.println();
```
syserrで`System.err.println();`に変換することもできます。

## main
```java
public static void main(String[] args) {

}
```
に変換できます。

## public_method
```java
public return_type name() {
	
}
```
とメソッドを作れます。
変換直後に戻り値の部分にフォーカスが当たっているので、戻り値の型はすぐに変換できます。
さらに`tab`でメソッド名にフォーカスが当たるので、メソッド名もすぐに書き換えられます。
ちなみに戻り値の型に`void`以外を指定しても自動的に`return`文が追加されはしません。
簡単にreturn文を追加する方法としては、returnがないためにコンパイルエラーとなるはずなので、ショートカットの`Ctrl + .`でエラー箇所に飛んで、`Ctrl + 1`でエラーの修正方法の候補が出るので、Add return statementを選べば、return文を追加できます。↓の画像です。
![image.jpg](https://qiita-image-store.s3.amazonaws.com/0/44676/035e98f9-accb-847a-7bb6-39c16f8680ea.jpeg)

類似のテンプレートとして、

* public_static_method
* protected_method
* private_method
* private_static_method

があります。これらは、それぞれの名称の通りに修飾子が異なります。

private_methodには代替方法があって、
適当なメソッド名を入力して`Ctrl + Space`でprivateメソッドを作成できます。
![image.jpg](https://qiita-image-store.s3.amazonaws.com/0/44676/cc82d9fd-5e0b-17bb-5337-1d9a12fa7b09.jpeg)
この場合は、操作としては`Ctrl + Space`ですが、Templateではなく、Java Proposalを使っていることになります。

# 知らなかったけど機会があったら使いたいもの

## switch
```java
switch (key) {
case value:

	break;

default:
	break;
}
```
私は、switchよりもif-elseを好んでいて、switch文の書き方をド忘れすることが多いので、次にswitch文を書くときに使おうと思います。
それがいつになるかはわかりませんが……。
switchを好まないのは、

* [switchに渡された文字列がnullだったときの挙動](http://d.hatena.ne.jp/nowokay/20130426)
* 記号の使い方がほかの構文とちょっと異質に感じる（「:」の使い方（？））

という理由です。

## instanceof
型を検査してキャストするコードです。

```java
if (var instanceof type) {
	type new_name = (type) var;

}
```

castと入力してから`Ctrl + Space`で下のようにキャスト部分だけのコードへと変換することもできます。

```java
type new_name = (type) name;
```


## toarray
先に`List<String> list = new ArrayList<String>();`というリストがあったりすると、

```java
(String[]) list.toArray(new String[list.size()])
```
となります。
この形に変換した直後はコンパイルエラーが出ていますが、単に

```java
String[] a = (String[]) list.toArray(new String[list.size()]);
```
とイコールの左側を書いてやれば問題なく使えます。

tolistもほしい感じですが、ありません。

## arraymerge
2つの配列をマージ。
arrayA、arrayBという2つの配列をすでに宣言してあると

```java
int[] arrayA2 = new int[arrayA.length + arrayB.length];
System.arraycopy(arrayA, 0, arrayA2, 0, arrayA.length);
System.arraycopy(arrayB, 0, arrayA2, arrayA.length, arrayB.length);
```
とマージできます。

## arrayadd
既存の配列よりも1長い配列を作成して、既存の配列をコピーして、末尾の要素に値を入れます。
List#addみたいなイメージです。
arrayという名前の配列をすでに宣言してあると、

```java
int[] array2 = new int[array.length + 1];
System.arraycopy(array, 0, array2, 0, array.length);
array2[array.length] = args;
```
というコードに変換できます。

## static_final
```java
public static final String NAME = "";
```
となります。
周囲の定数の宣言をコピペできることが多いので、冷静に考えると意外と使えないヤツです。

## while
先に`boolean`の`var`という変数があったとしたら、下のように条件に使ってくれます。

```java
while (condition) {
	
}
```

`Enum`のwhile文や`Iterator`を使用するwhile文に変換することもできます。

doと入力してから`Ctrl + Space`でdo-whileへと変換できたりもします。

## if
先に`boolean`の`var`という変数があったとしたら、下のようにifの条件に使ってくれます。

```java
if (var) {

}
```

* ifelse
* else
* elseif

というテンプレートもあります。名前の通り、elseだけを作ったり、elseifを作ったりできます。

## test
```java
@Test
public void testName() throws Exception {
	
}
```
JUnit4のテストメソッドです。

## test3
```java
public void testname() throws Exception {
	
}
```
JUnit3のテストメソッドです。
JUnit4との違いはアノテーションの有無です。JUnit3のテストメソッドは、メソッド名の先頭が「test」でなければいけないので、そうなっています。
AndroidアプリのJUnitのバージョンが3だった記憶があるので、その場合には出番があると思います。

#へぇ、と思ったけどたぶん一生使わないヤツ

## new
```java
type name = new type(arguments);
```
最初に型の部分にフォーカスが当たっているので、型はすぐに書き換えられます。
そこから`tab`で変数名、引数を順次編集できます。

私はよく

```java
new String();
```
と書いてから`Alt + Shift + l`で

```java
String string = new String();
```
を作っていますが、それよりもわずかに早いかもしれません。
`Alt + Shift + l`はイコールの右辺を書いてあれば自動的に左辺を作ってくれて汎用性が高いのでおすすめのショートカットです。

## lazy
```java
if (name == null) {
	name = new type(arguments);
	
}

return name;
```
シングルトンパターンの断片みたいなコードを作れます。
シングルトンパターンは、[いくつかの実装例がWikipediaに載っていて](http://ja.wikipedia.org/wiki/Singleton_%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3)勉強になりました。

## runnable
```java
new Runnable() {
	public void run() {
		
	}
}
```

`ExecutorService`に`submit`する`Runnable`を作るのには使えそうです。

## try
```java
try {
	
} catch (Exception e) {
	// TODO: handle exception
}
```
私は、とりあえず最初に処理内容を書いてから、try-catchが必要になってからはじめてtry-catchで囲うことが多いです。
このように、いきなりtry-catchから書き始めはしない人は多いんじゃないかなあ、と思います。

ちなみにcatchでcatch節だけを作ることもできます。

## synchronized
```java
synchronized (args) {
	
}
```

syまで入力して`Ctrl + Space`で候補の一番上にくると思います。
「synchronized」の綴りに自信がなかったり、めんどくさかったりすると、便利かもしれませんね。

## systrace
```java
System.out.println("TemplateTest.main()");
```

と「クラス名.メソッド名」をsysoutしてくれます。
単なる文字列なので、メソッド名を変更しても、この出力される文字列は自動的に変わりはしません。
[動的にクラス名やメソッド名を取得してsysoutする方法がある](http://qiita.com/arai-wa/items/ce10a144cc47c181d5b7)ので、私はそちらを使っています。

## fall-through
```java
//$FALL-THROUGH$
```
意図的にフォールスルーしていることをEclipseに教えるコメントです。
フォールスルーとは、switch文でbreakを抜かすあれのことだそうです([Wikipediaの解説](http://ja.wikipedia.org/wiki/Switch%E6%96%87##.E3.83.95.E3.82.A9.E3.83.BC.E3.83.AB.E3.82.B9.E3.83.AB.E3.83.BC))。
Eclipseを使っている時だけに意味があるコメントなので、あまり使いたくありませんね。

## nls
```java
//$NON-NLS-N$
```

Eclipseの設定によってハードコーディングされた文字列を検出して警告を出せるのですが、その警告を該当部分だけ黙らせるためのコメントです。
Eclipse特有のコメントなのであまり使いたくありませんね。

# まとめ
配列の操作をするためのテンプレートが多いですね。
基本的には`List`を使いたいものですが、理由があって配列をいじりまわすときに、ちょうどこのあたりを面倒くさく感じることがあったので、役に立てられそうです。

テンプレートは自分で追加することもできるので、お気に入りの形式のログとかがあれば、追加しておくと便利です。
新規追加も含めて、テンプレート関連の設定は、設定ウィンドウのJava -> Editor -> Templatesで弄れます。

`Ctrl + Space`でテンプレートを出せないときは、Java -> Editor -> Content Assist -> Advanced で「Template Proposal」のチェックが外れていると思います。