SlideShare uma empresa Scribd logo
1 de 39
Baixar para ler offline
What.is(<Generics>)
2015/7/28(火)
第3回 Java勉強会 in 秋葉原
中村 健司(nakamurakj@github)
自己紹介
• 株式会社マインドパレットにてSnapeeeを開発しています。
• 2002年よりJavaをメインの言語として使用。
• Spring Framework, JAX-RS(Jersey)などで実装するRest-APIが得意です。
• 現在はAWSをメインにこの辺を調べてます。
• Amazon CloudSearch
• Amazon API Gateway
• AWS Lambda
はじめに
• 初心者向けに端的に説明するため、誤った記
載等や端折ってる部分が多々あるかと思いま
す。
• 上級者の皆様は、懐に忍ばせたマサカリは
そっと隠したままでお願いします。
before J2SE 1.4
Type

Chaos
あの頃のエンジニアは苦しんだ
• ClassCastException地獄
• Object <—> プリミティブ変換地獄
• instanceof地獄
ClassCastException地獄
List list = new ArrayList();
list.add(new String(“ほげほげ”));
list.add(new Boolean(true)); // 昔はこんな実装平気でする人いた。
list.add(new Integer(10)); // マジでカオス

// なんかのためにつかうだろとか、仕様書とかコメントに書いてある。怖い。
list.add(new HashMap());
for (int i = 0; i < list.size() - 1, i++) {
String value = (String) list.get(i);
// i == 1 でClassCastException
}
Object <—>プリミティブ変換地獄
int i = 100;
Integer objInt = Integer.valueOf(i);
i = objInt.intValue();
boolean b = true;
Boolean objB = Boolean.valueOf(b);
b = objB.booleanValue();
float f = 100.1;
Float objF = Float.valueOf(f);
f = objF.floatValue();
instanceof地獄
public interface State {}
public class Unregistration implements State{}
public class TemporaryRegistration implements State{}
public class Registration implements State{}
public int getState(State state) {
if (state instanceof Unregistration) {
return 0;
} else if (state instanceof TemporaryRegistration) {
return 1;
} else if (state instanceof Registration) {
return 2;
}
return -1; // 状態異常的な。
}
とにかく型変換(Cast)は
バグの温床だった
なぜ?
• 書いてる本人ですらどこに何を入れてるか、
実装を見ないとわからない
• 当時はIDE(Eclipse)も普及していなかったた
め、デバッグは結構つらかった
• 起動時じゃないとでないExceptionのため、発
見されるのが運用後っていうことも
歴史背景的なモノ
• CとかCOBOL,VBをメインでやってた人たちがJavaを
初めてやることが多かったので、各言語の癖が強い実
装が多かった。
• オブジェクト指向とか、デザインパターンとか、リファ
クタリングとか騒がれ始めたのもこのころ。
• マシンスペックも低かったからIDE動かすと端末が固
まるレベル。(JBuilderとか古のIDEでした。)
2004/9/30

J2SE 5 release.
エンジニアはCast地獄から解放
された
• Generics
• auto-boxing
• Type-safe enum
Java5で文法も強化された
(各自しらべてください。)
• 拡張for文
• アノテーション
• 可変長引数
• static import
地獄の実装をふりかえる
ClassCastException地獄
List list = new ArrayList();
list.add(new String(“ほげほげ”));
list.add(new Boolean(true)); // 昔はこんな実装平気でする人いた。
list.add(new Integer(10)); // マジでカオス
list.add(new HashMap()); // なんかのためにつかうだろとか
for (int i = 0; i < list.size() - 1, i++) {
String value = (String) list.get(i);
// i == 1 でClassCastException
}
Generics
List<String> list = new ArrayList<String>();
// Java8
List<String> list = new ArrayList<String>();
/* Java7からはこうかけます。
List<String> list = new ArrayList<>();

*/
list.add(“ほげほげ”);
list.add(new Boolean(true)); // ここでコンパイルエラー
Object <—>プリミティブ変換地獄
int i = 100;
Integer objInt = Integer.valueOf(i);
i = objInt.intValue();
boolean b = true;
Boolean objB = Boolean.valueOf(b);
b = objB.booleanValue();
float f = 100.1;
Float objF = Float.valueOf(f);
f = objF.floatValue();
auto-boxing
List<String> list = new ArrayList<String>();
// Java8
int i = 100;
Integer objI = i; // プリミティブ —> Object
i = objI; // Object —> プリミティブ
boolean b = true;
Boolean objB = b;
b = objB;
float f = 100.1;
Float objF = f;
f = objF;
instanceof地獄
public interface State {}
public class Unregistration implements State{}
public class TemporaryRegistration implements State{}
public class Registration implements State{}
public int getState(State state) {
if (state instanceof Unregistration) {
return 0;
} else if (state instanceof TemporaryRegistration) {
return 1;
} else if (state instanceof Registration) {
return 2;
}
return -1; // 状態異常的な。
}
Type-safe enum
List<String> list = new ArrayList<String>();
// Java8
public enum State {
UNREGISTRATION,TEMPORARY_REGISTRATION,REGISTRATION;
}
public int getState(State state) {
if (state.equals(UNREGISTRATION)) {
return 0;
} else if (state.equals(TEMPORARY_REGISTRATION)) {
return 1;
} else {
// enumで定義されいるパラメータしかこないため。
// 上記以外は全部REGISTRATION
return 2;
}
}
コンパイル時に型の間違えを
発見できるようになった。
ちょうどこの頃開発マシンス
ペックも大分マシになり、
Eclipse2.x系がまともに動く
ようになった。
実装時に気がつくことが
できるようになり、
そもそもそんな実装自体が
世の中から減った。
ClassCastExceptionを
みることが激減した。
運用時のエラーがへって、
エンジニアは少しだけ幸せに
なった。(かもしれない。)
めでたしめでたし。
今日の本題



Genericsの使い方
Genericsの記載について
• <Type>という形式で記載される。
• <T> : Typeの意味で利用、型の指定で利用されることが多い
• <E> : Entityの意味で利用、型変換の元に使う等が多い
• <K> : Keyの意味で利用、MapのKeyなど
• <V>: Valueの意味で利用、MapのValueなど
• まあ、ぶっちゃけなんでもいい(笑)
基本的な使い方
public class User {
public Long id;
public String name;
}
public class UserManager {
private Map<Long, User> users = new HashMap<Long, User>();
public void addUser(User user) {
users.put(user.id, user); // 決まった型でしかputできない。
}
   public User getUser(long id) {
return users.get(id); // 取得時にCastしなくてよくなった。
}
}
全体指定
public class User {
public Long id;
public String name;
}
public class DatabaseAccessor<T> { // クラス全体で型を指定。
private Class<T> clazz; // 型の保持
public DatabaseAccessor(Class<T> clazz) {
this.clazz = clazz; // コンストラクタでclassTypeを渡して、各メソッドで利用
}
public List<T> findAll() {// 実装略}
public int create(T entity) {// 実装略}
public int update(T entity) {// 実装略}
public int delete(T entity) {// 実装略}
}



// 生成方法
DatabaseAccessor<User> accessor = new DatabaseAccessor<User>(User.class);
List<User> users = accessor.findAll();
accessor.create(new User(1, ”Duke.”)); // User型のみ扱えるようになる。
継承を指定
public abstract class AbstractEntity {
public Timestamp lastUpdate;
} 
public class User extends AbstractEntity {
public Long id;
public String name;
}
public class DatabaseAccessor<T extends AbstractEntity> { // AbstractEntityを継承していなければならない。
private Class<T> clazz; // 型の保持
public DatabaseAccessor(Class<T> clazz) {
this.clazz = clazz; // コンストラクタでclassTypeを渡して、各メソッドで利用
}
public List<T> findAll() {// 実装略}
public int create(T entity) {// 実装略}
public int update(T entity) {// 実装略}
public int delete(T entity) {// 実装略}
}
// 生成方法
DatabaseAccessor<User> accessor = new DatabaseAccessor<User>(User.class);
型変換
// jsonをJavaObjectに変換するような例
public static <T> T fromJson(Class<T> type, String json){
return Json.fromJson(type, json); //変換クラスは仮
}
// 使い方
String json = {”id” : 10, ”name” : ”Kenji Nakamura”};
User user = fromJson(User.class, json);
// 継承も可能
public static <T, E> T convert(
Class<T extends AbstractT> t, E entity) {
return Converter.convert(t, entity); //変換クラスは仮
}
何が来るか推測できないとき
(ワイルドカード)
// 主に1.4以前の実装を変えるときにつかった
public static List<?> getParameter() {
// Typeを?にすると、何でも入る。<Object>と同意義。
List<?> parameter = new ArrayList<?>();
parameter.add(1);
parameter.add(false);
parameter.add(“aaaa”);
return parameter;
}
Genericsを使うことで
• 型の固定
• 安全性の担保
• ロジックの共通化
• 可視性の向上
ソースの品質が良くなる。
(はず。)
参考リンク
• JDK5.0 ドキュメント

https://docs.oracle.com/javase/jp/1.5.0/
• J2SE 5.0 虎の穴

http://www.javainthebox.net/laboratory/J2SE1.5/contents.html
• 今更人に聞けないJava5からの新機能(J2SE 5.0)

http://qiita.com/Usek/items/3ff30e7a1a87ba64cb58
ご清聴ありがとう
ございました。







make future the Java

Mais conteúdo relacionado

Mais procurados

C# LINQ ~深く知って、使いまくろう~
C# LINQ ~深く知って、使いまくろう~C# LINQ ~深く知って、使いまくろう~
C# LINQ ~深く知って、使いまくろう~Fujio Kojima
 
BOF1-Scala02.pdf
BOF1-Scala02.pdfBOF1-Scala02.pdf
BOF1-Scala02.pdfHiroshi Ono
 
Javaセキュアコーディングセミナー東京第3回演習の解説
Javaセキュアコーディングセミナー東京第3回演習の解説Javaセキュアコーディングセミナー東京第3回演習の解説
Javaセキュアコーディングセミナー東京第3回演習の解説JPCERT Coordination Center
 
【java8 勉強会】 怖くない!ラムダ式, Stream API
【java8 勉強会】 怖くない!ラムダ式, Stream API【java8 勉強会】 怖くない!ラムダ式, Stream API
【java8 勉強会】 怖くない!ラムダ式, Stream APIdcomsolution
 
Java x Groovy: improve your java development life
Java x Groovy: improve your java development lifeJava x Groovy: improve your java development life
Java x Groovy: improve your java development lifeUehara Junji
 
C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~
C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~
C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~Fujio Kojima
 
LINQ 概要 + 結構便利な LINQ to XML
LINQ 概要 + 結構便利な LINQ to XMLLINQ 概要 + 結構便利な LINQ to XML
LINQ 概要 + 結構便利な LINQ to XMLShinichiAoyagi
 
Javaプログラミング入門【第2回】
Javaプログラミング入門【第2回】Javaプログラミング入門【第2回】
Javaプログラミング入門【第2回】Yukiko Kato
 
【LT版】Elixir入門「第7回:Python/KerasをElixirから繋いでアレコレする」
【LT版】Elixir入門「第7回:Python/KerasをElixirから繋いでアレコレする」【LT版】Elixir入門「第7回:Python/KerasをElixirから繋いでアレコレする」
【LT版】Elixir入門「第7回:Python/KerasをElixirから繋いでアレコレする」fukuoka.ex
 
Scalaで型クラス入門
Scalaで型クラス入門Scalaで型クラス入門
Scalaで型クラス入門Makoto Fukuhara
 
C#を始めたばかりの人へのLINQ to Objects
C#を始めたばかりの人へのLINQ to ObjectsC#を始めたばかりの人へのLINQ to Objects
C#を始めたばかりの人へのLINQ to ObjectsFumitaka Yamada
 
What Dotty fixes @ Scala関西サミット
What Dotty fixes @ Scala関西サミットWhat Dotty fixes @ Scala関西サミット
What Dotty fixes @ Scala関西サミットTaisuke Oe
 
Java SE 8 lambdaで変わる プログラミングスタイル
Java SE 8 lambdaで変わる プログラミングスタイルJava SE 8 lambdaで変わる プログラミングスタイル
Java SE 8 lambdaで変わる プログラミングスタイルなおき きしだ
 
LINQソースでGO!
LINQソースでGO!LINQソースでGO!
LINQソースでGO!Kouji Matsui
 
Javaプログラミング入門【第3回】
Javaプログラミング入門【第3回】Javaプログラミング入門【第3回】
Javaプログラミング入門【第3回】Yukiko Kato
 
Sns suite presentation
Sns suite presentationSns suite presentation
Sns suite presentationJason Namkung
 

Mais procurados (19)

Java8勉強会
Java8勉強会Java8勉強会
Java8勉強会
 
C# LINQ ~深く知って、使いまくろう~
C# LINQ ~深く知って、使いまくろう~C# LINQ ~深く知って、使いまくろう~
C# LINQ ~深く知って、使いまくろう~
 
BOF1-Scala02.pdf
BOF1-Scala02.pdfBOF1-Scala02.pdf
BOF1-Scala02.pdf
 
Javaセキュアコーディングセミナー東京第3回演習の解説
Javaセキュアコーディングセミナー東京第3回演習の解説Javaセキュアコーディングセミナー東京第3回演習の解説
Javaセキュアコーディングセミナー東京第3回演習の解説
 
【java8 勉強会】 怖くない!ラムダ式, Stream API
【java8 勉強会】 怖くない!ラムダ式, Stream API【java8 勉強会】 怖くない!ラムダ式, Stream API
【java8 勉強会】 怖くない!ラムダ式, Stream API
 
Java x Groovy: improve your java development life
Java x Groovy: improve your java development lifeJava x Groovy: improve your java development life
Java x Groovy: improve your java development life
 
C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~
C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~
C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~
 
LINQ 概要 + 結構便利な LINQ to XML
LINQ 概要 + 結構便利な LINQ to XMLLINQ 概要 + 結構便利な LINQ to XML
LINQ 概要 + 結構便利な LINQ to XML
 
Javaプログラミング入門【第2回】
Javaプログラミング入門【第2回】Javaプログラミング入門【第2回】
Javaプログラミング入門【第2回】
 
【LT版】Elixir入門「第7回:Python/KerasをElixirから繋いでアレコレする」
【LT版】Elixir入門「第7回:Python/KerasをElixirから繋いでアレコレする」【LT版】Elixir入門「第7回:Python/KerasをElixirから繋いでアレコレする」
【LT版】Elixir入門「第7回:Python/KerasをElixirから繋いでアレコレする」
 
Scalaで型クラス入門
Scalaで型クラス入門Scalaで型クラス入門
Scalaで型クラス入門
 
C#を始めたばかりの人へのLINQ to Objects
C#を始めたばかりの人へのLINQ to ObjectsC#を始めたばかりの人へのLINQ to Objects
C#を始めたばかりの人へのLINQ to Objects
 
Project lambda
Project lambdaProject lambda
Project lambda
 
20150302 java8 第一回_ラムダ式(1)
20150302 java8 第一回_ラムダ式(1)20150302 java8 第一回_ラムダ式(1)
20150302 java8 第一回_ラムダ式(1)
 
What Dotty fixes @ Scala関西サミット
What Dotty fixes @ Scala関西サミットWhat Dotty fixes @ Scala関西サミット
What Dotty fixes @ Scala関西サミット
 
Java SE 8 lambdaで変わる プログラミングスタイル
Java SE 8 lambdaで変わる プログラミングスタイルJava SE 8 lambdaで変わる プログラミングスタイル
Java SE 8 lambdaで変わる プログラミングスタイル
 
LINQソースでGO!
LINQソースでGO!LINQソースでGO!
LINQソースでGO!
 
Javaプログラミング入門【第3回】
Javaプログラミング入門【第3回】Javaプログラミング入門【第3回】
Javaプログラミング入門【第3回】
 
Sns suite presentation
Sns suite presentationSns suite presentation
Sns suite presentation
 

Semelhante a JavaのGenericsとは?

第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」yoshiaki iwanaga
 
「Html sql」で図書館hpにアクセスしてみよう
「Html sql」で図書館hpにアクセスしてみよう「Html sql」で図書館hpにアクセスしてみよう
「Html sql」で図書館hpにアクセスしてみようKentaro Matsui
 
Java開発の強力な相棒として今すぐ使えるGroovy
Java開発の強力な相棒として今すぐ使えるGroovyJava開発の強力な相棒として今すぐ使えるGroovy
Java開発の強力な相棒として今すぐ使えるGroovyYasuharu Nakano
 
探検!SwiftyJSON
探検!SwiftyJSON探検!SwiftyJSON
探検!SwiftyJSONYuka Ezura
 
Kanazawa.js.Next
Kanazawa.js.NextKanazawa.js.Next
Kanazawa.js.Nextdynamis
 
Xtend - Javaの未来を今すぐ使う
Xtend - Javaの未来を今すぐ使うXtend - Javaの未来を今すぐ使う
Xtend - Javaの未来を今すぐ使うTatsumi Naganuma
 
Deep dive into oss written in swift
Deep dive into oss written in swiftDeep dive into oss written in swift
Deep dive into oss written in swiftYuki Asai
 
Deep dive into oss written in swift
Deep dive into oss written in swiftDeep dive into oss written in swift
Deep dive into oss written in swiftYuki Asai
 
TypeScript 言語処理系ことはじめ
TypeScript 言語処理系ことはじめTypeScript 言語処理系ことはじめ
TypeScript 言語処理系ことはじめYu Nobuoka
 
Best practice laravel
Best practice laravelBest practice laravel
Best practice laravelRisa Ohnishi
 
夏だからJava再入門
夏だからJava再入門夏だからJava再入門
夏だからJava再入門Katsumi Honda
 
Swift 2.0 で変わったところ「後編」 #cswift
Swift 2.0 で変わったところ「後編」 #cswiftSwift 2.0 で変わったところ「後編」 #cswift
Swift 2.0 で変わったところ「後編」 #cswiftTomohiro Kumagai
 
ちょっと詳しくJavaScript 特別編【悪霊の神々】
ちょっと詳しくJavaScript 特別編【悪霊の神々】ちょっと詳しくJavaScript 特別編【悪霊の神々】
ちょっと詳しくJavaScript 特別編【悪霊の神々】株式会社ランチェスター
 
Javaプログラミング入門【第7回】
Javaプログラミング入門【第7回】Javaプログラミング入門【第7回】
Javaプログラミング入門【第7回】Yukiko Kato
 
ActiveResourceが面白すぎる件
ActiveResourceが面白すぎる件ActiveResourceが面白すぎる件
ActiveResourceが面白すぎる件Kazuki MATSUMOTO
 
イマドキの現場で使えるJavaライブラリ事情
イマドキの現場で使えるJavaライブラリ事情イマドキの現場で使えるJavaライブラリ事情
イマドキの現場で使えるJavaライブラリ事情takezoe
 

Semelhante a JavaのGenericsとは? (20)

第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」
 
「Html sql」で図書館hpにアクセスしてみよう
「Html sql」で図書館hpにアクセスしてみよう「Html sql」で図書館hpにアクセスしてみよう
「Html sql」で図書館hpにアクセスしてみよう
 
Java開発の強力な相棒として今すぐ使えるGroovy
Java開発の強力な相棒として今すぐ使えるGroovyJava開発の強力な相棒として今すぐ使えるGroovy
Java開発の強力な相棒として今すぐ使えるGroovy
 
探検!SwiftyJSON
探検!SwiftyJSON探検!SwiftyJSON
探検!SwiftyJSON
 
Junit4
Junit4Junit4
Junit4
 
Kanazawa.js.Next
Kanazawa.js.NextKanazawa.js.Next
Kanazawa.js.Next
 
Xtend - Javaの未来を今すぐ使う
Xtend - Javaの未来を今すぐ使うXtend - Javaの未来を今すぐ使う
Xtend - Javaの未来を今すぐ使う
 
Deep dive into oss written in swift
Deep dive into oss written in swiftDeep dive into oss written in swift
Deep dive into oss written in swift
 
Deep dive into oss written in swift
Deep dive into oss written in swiftDeep dive into oss written in swift
Deep dive into oss written in swift
 
Introduction Xtend
Introduction XtendIntroduction Xtend
Introduction Xtend
 
TypeScript 言語処理系ことはじめ
TypeScript 言語処理系ことはじめTypeScript 言語処理系ことはじめ
TypeScript 言語処理系ことはじめ
 
Best practice laravel
Best practice laravelBest practice laravel
Best practice laravel
 
夏だからJava再入門
夏だからJava再入門夏だからJava再入門
夏だからJava再入門
 
Cubby 2006-08-23
Cubby 2006-08-23Cubby 2006-08-23
Cubby 2006-08-23
 
Scala東北紹介
Scala東北紹介Scala東北紹介
Scala東北紹介
 
Swift 2.0 で変わったところ「後編」 #cswift
Swift 2.0 で変わったところ「後編」 #cswiftSwift 2.0 で変わったところ「後編」 #cswift
Swift 2.0 で変わったところ「後編」 #cswift
 
ちょっと詳しくJavaScript 特別編【悪霊の神々】
ちょっと詳しくJavaScript 特別編【悪霊の神々】ちょっと詳しくJavaScript 特別編【悪霊の神々】
ちょっと詳しくJavaScript 特別編【悪霊の神々】
 
Javaプログラミング入門【第7回】
Javaプログラミング入門【第7回】Javaプログラミング入門【第7回】
Javaプログラミング入門【第7回】
 
ActiveResourceが面白すぎる件
ActiveResourceが面白すぎる件ActiveResourceが面白すぎる件
ActiveResourceが面白すぎる件
 
イマドキの現場で使えるJavaライブラリ事情
イマドキの現場で使えるJavaライブラリ事情イマドキの現場で使えるJavaライブラリ事情
イマドキの現場で使えるJavaライブラリ事情
 

JavaのGenericsとは?