概要
私のJavaの知識は、「1.4」でほぼ止まってしまっています。
現状を変えるため、少しずつバージョンアップして行こうと思います。
現在、業務で主に触ってたアプリは、「1.5」で動いていますが、
もともとは「1.4」以前に作られたアプリで、古い記述が残っています。
このアプリのバージョンアップを通して「1.5」で追加された機能について調べた事を記載します。
調べたこと
変数名にmapとかlst、strとか付いており、違和感を感じる所があるかもしれませんが、
社内の命名規則(今は違う)に従って記述された箇所なだけなので、気にしないでください。
総称型(ジェネリクス)
総称型(ジェネリクス)を使用できそうな箇所があったので、
下記のように修正しました。
- 修正前
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など)を保存しています。
- 修正後
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等などのコレクションに入る値の型が明示的に分かります。
また、指定された型以外の値を入れようとするとエラーになるため、コンパイルエラーも見つけやすくなります。
今回は、コレクションにジェネリクスを用いているが、ジェネリクスを使ってクラスやメソッドを実装することもできる。
参考:ジェネリクス
public class MakerCode<T> {
public void show(T[] id) {
for (T v : id) {
System.out.println(v);
}
}
}
public class Car {
private String[] id = {"TY", "NS", "HN"};
public String[] getId() {
return id;
}
}
public class Bike {
private Integer[] id = {10, 20, 30}; //オートボクシング
public Integer[] getId() {
return id;
}
}
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());
}
}
さらに、ワイルドカードが使えるようですが、難しい・・・もっと調べる必要がありそう。
参考:ワイルドカード
拡張for文
拡張for文を使用できそうな箇所があったので、
下記のように修正しました。
- 修正前
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とか)が入ってます。
- 修正後
List<String> lstMaker = new ArrayList<String>();
SQLParameters sqlParams = new SQLParameters();
for (String id : lstMaker) {
sqlParams.add(id);
}
通常のfor文と比べ記述が簡素になっています。
コーディング量が僅かに減りました。見た目もスッキリ!
オートボクシング
上記の「総称型(ジェネリクス)」に記載しているBike.java
で使用しています。
「1.4」までの場合は、
private Integer[] id = {new Integer(10), new Integer(20), new Integer(30)};
ように書かないと「型の不一致: int から Integer には変換できません
」になっていましたが、
「1.5」からは、プリミティブ型からラッパークラスの変換、ラッパークラスからプリミティブ型への変換
を自動で行ってくれるようになりました。
可変引数
アプリ内で使えそうな所が見当たりませんでしたが、
変数の型に続けて「...」と書くことで可変引数として定義出来ます。
public void print(String... value) {
for (String v : value) {
System.out.println(v);
}
}
public static void main(String[] args) {
(new Main()).print("東京都", "神奈川県", "埼玉県", "千葉県");
}
配列を渡すこともできます。
public static void main(String[] args) {
String[] pref = {"北海道", "青森県", "山形県", "岩手県"};
(new Main()).print(pref);
}
可変引数は、各メソッドに1つだけ&最後の引数にのみ指定する事ができます。
列挙型
複数の定数を1つにまとめて管理できる型
下記のような記述を1つの型にまとめる事ができます。
- 修正前
public static final String STATUS_SUCCESS = "1";
public static final String STATUS_SHORTAGE = "2";
public static final String STATUS_MISMATCH = "3";
- 修正後(列挙型を使用)
public enum Status {
SUCCESS,
SHORTAGE,
MISMATCH,
}
下記のように特定の値を持たせる事ができます。
public enum Status {
SUCCESS ("1"),
SHORTAGE ("2"),
MISMATCH ("3"),
;
private final String value;
private Status(final String value) {
this.value = value;
}
}
メソッドを持つことも出来ます。
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」に進もうと思います。
アノテーションについては別途もう少し深く調べてみます。
参考:新機能と拡張機能