7. 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
}
8. 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();
9. 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; // 状態異常的な。
}
17. 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
}
18. 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)); // ここでコンパイルエラー
19. 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();
20. 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;
21. 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; // 状態異常的な。
}
22. 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;
}
}
31. 基本的な使い方
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しなくてよくなった。
}
}
32. 全体指定
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型のみ扱えるようになる。
33. 継承を指定
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);
34. 型変換
// 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); //変換クラスは仮
}