Java学習 ジェネリクスについて

私は初学者なこともあり、最初に習った配列を使ったプログラムを作ることが多いです。

しかし、実務ではジェネリクスとコレクションを用いた実装の方が「確実」であるそうです。

日頃はこういった内容は自分だけの手書きのノートにまとめるのですが、そろそろ4月も近づいてきましたので、学習をポートフォリオ化することも兼ねたアウトプットをノートに行っていきたいと思います。

[ジェネリクスの必要性]

ジェネリクスはいわゆる<>(ダイヤモンド演算子)で囲んで、使用できる型を限定することです。

この「限定すること」がジェネリクスのメリットです。

配列とジェネリクスなしのコレクション、ジェネリクスありのコレクションで比較してみます。

まずは配列です。
Object[] object ;
Integer[] integer = {1,2,3};
object = integer;
Object型は全てのクラスのスーパークラスなので、object型配列にはinteger型配列も、何でも入れてしまえることになります。
これは初学者の私でも、いずれ何かあった時にコードが追えなくなりそうだと思います。

次にジェネリクスなしのコレクションの場合です。
ペンギン君とカワウソ君が2人で新しいサービスを立ち上げました。
新しいサービスは大きくなるにつれて、色々な動物がかかわるようになりました。
コアラ君はある時、ペンギン君とカワウソ君がString型でキャストして取り出すことを前提にしているList型のコレクションに数値をいれてしまいました。
実行してみると、エラーが起きます。
今回はたまたまテスト時に気づけたかもしれませんが、0.01%の確率で数値データが紛れ込むようなことがあると、本番環境でとんでもないことがおきてしまうかもしれません。
と、いうのがジェネリクスなしのコレクションの怖いところだそうです。

落ちるサンプルコードを写経してみました。

import java.util.ArrayList;
import java.util.List;

public class test {
public static void main(String[] args) {
	
	List list = new ArrayList();
	list.add("penguin");
	list.add("kawauso");
	list.add(100000);
	
	show sh = new show();
	sh.show(list);;
	
      }
}
import java.util.List;

public class show {

  public void show(List list) {
		
	for(Object obj : list) {
			
		String str = (String) obj;
		System.out.println(str);
			
		}
	}
}

noteでコードを書くとインデントが異様に広く取られるので、このままコピペすると変な感じになりそうなので注意してください。

このコードは実行すると、クラスキャストで例外となり落ちます。

ではジェネリクスがあるとどうなるのか??

数値データにはコンパイルエラー表示が出ている

このようにコンパイルエラーで知らせてくれます。
また、取り出す側もString型が入っていることがわかっているので、キャストを行う必要性がなくなります。

コードも短くなり、コンパイラーもバグを検出できるようになりました。

これがジェネリクス導入の背景だそうです。

Qiitaで見てもジェネリクスが導入される前まではクラスキャストでよく落ちたそうなので、ジェネリクスは間違いなく使った方が良さそうです。

[参考文献・動画]


この記事が気に入ったらサポートをしてみませんか?