Java5について調べたこと

# 概要
私のJavaの知識は、「1.4」でほぼ止まってしまっています。
現状を変えるため、少しずつバージョンアップして行こうと思います。

現在、業務で主に触ってたアプリは、「1.5」で動いていますが、
もともとは「1.4」以前に作られたアプリで、古い記述が残っています。
このアプリのバージョンアップを通して「1.5」で追加された機能について調べた事を記載します。

# 調べたこと
変数名にmapとかlst、strとか付いており、違和感を感じる所があるかもしれませんが、
社内の命名規則（今は違う）に従って記述された箇所なだけなので、気にしないでください。

## 総称型（ジェネリクス）
総称型（ジェネリクス）を使用できそうな箇所があったので、
下記のように修正しました。

- 修正前

```java
private Map mapPref = new HashMap();
public String getPrefID(String strName) {
  if (strName == null) {
    return "";
  }
  return mapPref.get(strName) == null ? "" : (String)mapPref.get(strName);
}
```

キーに都道府県名（東京都など）、値に都道府県ID（北海道は01、東京都の場合は13など）を保存しています。

- 修正後

```java
private Map<String, String> mapPref = new HashMap<String, String>();
public String getPrefID(String strName) {
  if (strName == null) {
    return "";
  }
  return mapPref.get(strName) == null ? "" : mapPref.get(strName);
}
```

ジェネリクスを使うことで、Map等などのコレクションに入る値の型が明示的に分かります。
また、指定された型以外の値を入れようとするとエラーになるため、コンパイルエラーも見つけやすくなります。
今回は、コレクションにジェネリクスを用いているが、ジェネリクスを使ってクラスやメソッドを実装することもできる。

参考：[ジェネリクス](https://github.com/travitu/Java-Tips/wiki/%E3%82%B8%E3%82%A7%E3%83%8D%E3%83%AA%E3%82%AF%E3%82%B9%EF%BC%88%E7%B7%8F%E7%A7%B0%E5%9E%8B%EF%BC%89)

```java:MakerCode.java
public class MakerCode<T> {
  public void show(T[] id) {
    for (T v : id) {
      System.out.println(v);
    }
  }
}
```

```java:Car.java
public class Car {
  private String[] id = {"TY", "NS", "HN"};
  public String[] getId() {
    return id;
  }
}
```

```java:Bike.java
public class Bike {
  private Integer[] id = {10, 20, 30}; //オートボクシング
  public Integer[] getId() {
    return id;
  }
}
```

```java:Main.java
public class Main {
  public static void main(String[] args) {
    Car car = new Car();
    MakerCode<String> carMakerCode = new MakerCode<String>();
    carMakerCode.show(car.getId());

    Bike bike = new Bike();
    MakerCode<Integer> bikeMakerCode = new MakerCode<Integer>();
    bikeMakerCode.show(bike.getId());
  }
}
```

さらに、**ワイルドカード**が使えるようですが、難しい・・・もっと調べる必要がありそう。
参考：[ワイルドカード](https://www.ibm.com/developerworks/jp/java/library/j-jtp04298.html)

## 拡張for文
拡張for文を使用できそうな箇所があったので、
下記のように修正しました。

- 修正前

```java
List<String> lstMaker = new ArrayList<String>();
SQLParameters sqlParams = new SQLParameters();
for (int i = 0; i < lstMaker.size(); i++) {
  sqlParams.add(lstMaker.get(i));
}
```

lstMakerには、メーカーに割り当てたID（A社は1とか）が入ってます。

- 修正後

```java
List<String> lstMaker = new ArrayList<String>();
SQLParameters sqlParams = new SQLParameters();
for (String id : lstMaker) {
  sqlParams.add(id);
}
```

通常のfor文と比べ記述が簡素になっています。
コーディング量が僅かに減りました。見た目もスッキリ！

## オートボクシング
上記の「総称型（ジェネリクス）」に記載している`Bike.java`で使用しています。
「1.4」までの場合は、

```java
private Integer[] id = {new Integer(10), new Integer(20), new Integer(30)};
```
ように書かないと「`型の不一致: int から Integer には変換できません`」になっていましたが、
「1.5」からは、プリミティブ型からラッパークラスの変換、ラッパークラスからプリミティブ型への変換
を自動で行ってくれるようになりました。

## 可変引数
アプリ内で使えそうな所が見当たりませんでしたが、
変数の型に続けて「...」と書くことで可変引数として定義出来ます。

```java
public void print(String... value) {
  for (String v : value) {
    System.out.println(v);
  }
}
```

```java
public static void main(String[] args) {
  (new Main()).print("東京都", "神奈川県", "埼玉県", "千葉県");
}
```

配列を渡すこともできます。

```java
public static void main(String[] args) {
  String[] pref = {"北海道", "青森県", "山形県", "岩手県"};
  (new Main()).print(pref);
}
```

可変引数は、各メソッドに1つだけ＆最後の引数にのみ指定する事ができます。

## 列挙型
複数の定数を1つにまとめて管理できる型
下記のような記述を1つの型にまとめる事ができます。

- 修正前

```java
public static final String STATUS_SUCCESS  = "1";
public static final String STATUS_SHORTAGE = "2";
public static final String STATUS_MISMATCH = "3";
```

- 修正後（列挙型を使用）

```java
public enum Status {
  SUCCESS,
  SHORTAGE,
  MISMATCH,
}
```

下記のように特定の値を持たせる事ができます。

```java
public enum Status {
  SUCCESS  ("1"),
  SHORTAGE ("2"),
  MISMATCH ("3"),
  ;
  private final String value;
  private Status(final String value) {
    this.value = value;
  }
}
```

メソッドを持つことも出来ます。

```java
public enum Status {
  SUCCESS  ("1"),
  SHORTAGE ("2"),
  MISMATCH ("3"),
  ;
  private final String value;
  private Status(final String value) {
    this.value = value;
  }
  public String getValue() {
    return this.value;
  }
}
```

## その他
その他にも追加された機能がありましたが、一旦「1.5」についてはこれ位にして「1.6」に進もうと思います。
アノテーションについては別途もう少し深く調べてみます。

参考：[新機能と拡張機能](https://docs.oracle.com/javase/jp/1.5.0/relnotes/features.html)