知っていると便利な章

4.12. 原型を使用しない

『目的』

Java5からは文法レベルの機能としてジェネリクスが導入されています。 ジェネリクスを使用して、コンパイル時に型安全性を確保できるようにしましょう。

『Before』

原型を使用したリスト操作
以下の例では原型のList型を使用しています。
この場合、リストにどのような型の値でも入れられてしまい、リストから値を取り出すときに型安全性が壊れてしまう可能性があります。

List l = new LinkedList();

// なんでも入れられてしまう...
l.add("あ");
l.add(123);

printAllRaw(l);

// Stringのみを保持したいのに、なにが入っているかわからない...
String s = (String)l.get(0);

private void printAllRaw(List list) {
    // 要素はObject型としてしか取得できない。
    for (Object e : list) {
        System.out.println(e);
    }
    list.add("789");
}

javacのオプションとして-Xlintを指定すると原型の使用が警告として扱われるため、必要に応じて付加するといいでしょう。

『After』

ジェネリクスを使用したリスト操作
以下の例ではList型を使用しています。
この場合、リストにはInteger型の値しか入れられず、リストから値を取り出すときにも型安全性が保たれます。 また、キャストも必要ないため、コードの見通しが良くなります。

List<Integer> l = new LinkedList<>();
l.add(123);
l.add(456);
//  l.add("あ"); コンパイルエラー!

printAllInteger(l);

Integer i = l.get(0);

private void printAllInteger(List<Integer> list) {
    // 要素はInteger型としてしか取得できる。
    for (Integer e : list) {
        System.out.println(e);
    }
    list.add(789);
    // 異なる型は追加不可能。コンパイルエラー!
//    list.add("789");
}

< 前のページへ
お問い合わせ
  • ようかん
  • SG Labs(エスジー ラボ)
  • ITERACY
  • RiceLog(ライスログ)
  • Salesforce導入コンサルティング
  • SES営業向け用語講座

Pagetop