Item 33. Type Safe Heterogeneous Container
νμ μμ μ΄μ’ 컨ν μ΄λλ₯Ό κ³ λ €νλΌ
μ λ€λ¦μ Set, Map κ°μ 컬λ μ
κ³Ό ThreadLocal, AtomicReference κ°μ λ¨μΌ μμ 컨ν
μ΄λμλ μμ£Ό μ¬μ©λλ€.
보ν΅μ νλ(Set) νΉμ λ κ°(Map)μ νμ
λ§€κ°λ³μκ° μ¬μ©λμ§λ§, λλ‘λ μΈ κ° μ΄μμ μμ κ°μκ° νμν κ²½μ°κ° μλ€.
νμ
μμ μ΄μ’
컨ν
μ΄λ(type safe heterogeneous container)
νμ μμ μ΄μ’ 컨ν μ΄λ ν¨ν΄μ μ΄μ©νμ¬ μμ νμ μ μμλ₯Ό μ μ₯νκ³ κ²μν μ μλ 컨ν μ΄λλ₯Ό λ§λ€ μ μλ€. 컨ν μ΄λ λμ ν€λ₯Ό λ§€κ°λ³μνν λ€, 컨ν μ΄λμ κ°μ λ£κ±°λ λΊ λ λ§€κ°λ³μνν ν€λ₯Ό ν¨κ» μ 곡νλ λ°©μμΌλ‘ μ΄λ κ² νλ©΄ μ λ€λ¦ νμ μμ€ν μ΄ κ°μ νμ μ΄ ν€μ κ°μμ 보μ₯νκ² λλ€.
κ° νμ
μ Class κ°μ²΄λ₯Ό λ§€κ°λ³μνν ν€ μν λ‘ μ¬μ©ν μ μλλ°, μ΄ λ°©μμ΄ λμνλ μ΄μ λ classμ ν΄λμ€κ° μ λ€λ¦μ΄κΈ° λλ¬Έμ΄λ€.
μμλ‘ μλμ FavoritesλΌλ ν΄λμ€λ₯Ό 보μ.
class Favorites {
private final Map<Class<?>, Object> favorites = new HashMap<>();
// ν΄λμ€μ 리ν°λ΄ νμ
μ Classκ° μλ Class<T>λ‘ ννν μ μλ€.(= νμ
ν ν°)
public <T> void putFavorite(Class<T> type, T instance) {
// Class κ°μ²΄μ μΈμ€ν΄μ€λ₯Ό λ§€ννμ¬ μ μ₯, ν€μ κ° μ¬μ΄μ νμ
κ΄κ³κ° μλ©Έλμ§λ§ λ
Όλ¦¬μ μΌλ‘λ 보μ₯λλ€.
favorites.put(Objects.requireNonNull(type), instance);
}
public <T> T getFavorite(Class<T> type) {
// favorites.get(type)λ‘ Class κ°μ²΄λ₯Ό ν΅ν΄ μΈμ€ν΄μ€λ₯Ό κ°μ Έμ¨ λ€, νμ
μΊμ€ν
νμ¬ λ°ν
// * cast λ©μλ: νλ³ν μ°μ°μμ λμ λ²μ μΌλ‘, νμ
μ μΈμ€ν΄μ€μΈμ§ νμΈν λ€ μΈμ€ν΄μ€λ₯Ό T νμ
μΌλ‘ λ°ν(μ€ν¨ μ ClassCastException λ°μ)
return type.cast(favorites.get(type));
}
}
class Main {
public static void main(String[] args) {
Favorites f = new Favorites();
f.putFavorite(String.class, "Java"); // String ν΄λμ€ νμ
-> Class<String>
f.putFavorite(Integer.class, 0xeee); // Integer ν΄λμ€ νμ
-> Class<Integer>
f.putFavorite(Class.class, Favorites.class); // Class ν΄λμ€ νμ
-> Class<Class>
String favoriteString = f.getFavorite(String.class);
int favoriteInteger = f.getFavorite(Integer.class);
Class<?> favoriteClass = f.getFavorite(Class.class);
System.out.printf("%s %x %s", favoriteString, favoriteInteger, favoriteClass.getName());
}
}Favoriteμμ Map<Class<?>, Object>λ₯Ό μ¬μ©νκ³ μμΌλ©°, κ·Έ νΉμ§μ λ€μκ³Ό κ°λ€.
Key(
Class<?>): ν΄λμ€ λ¦¬ν°λ΄λ‘, νΉμ ν΄λμ€λ‘ μ ννμ§ μκ³ , λͺ¨λ ν΄λμ€λ₯Ό νμ©νλ€.Value(
Object): ν΄λμ€μ μΈμ€ν΄μ€μ΄λ©°, Objectλ‘ μ ννμ§ μκ³ , λͺ¨λ ν΄λμ€λ₯Ό νμ©νλ€.Valueκ° λ¨μ
Objectμ΄κΈ° λλ¬Έμ ν€μ κ° μ¬μ΄μ νμ κ΄κ³λ₯Ό 보μ¦νμ§ μμ§λ§, λ Όλ¦¬μ μΌλ‘λ ν€μ κ°μ νμ κ΄κ³κ° 보μ₯λλ€.
?(λΉνμ μ μμΌλμΉ΄λ νμ
)κ° μ‘΄μ¬νμ¬ μ΄λΌ μ무κ²λ λ£μ μ μλ κ²μ²λΌ 보μ΄μ§λ§,
μμΌλμΉ΄λ νμ
μ΄ μ€μ²©(nested)λμ΄ μκΈ° λλ¬Έμ λ§΅μ΄ μλλΌ ν€κ° μμΌλμΉ΄λ νμ
μ΄λ―λ‘ Class<?>λ λͺ¨λ ν΄λμ€λ₯Ό νμ©νλ νμ
μ΄ λλ€.
νμ
μμ μ΄μ’
컨ν
μ΄λμ μ μ½ μ¬ν
νμ μμ μ΄μ’ 컨ν μ΄λ ν¨ν΄μ μμ νμ μ μμλ₯Ό μ μ₯νκ³ κ²μν μ μμ§λ§, μ μ½ μ¬νμ΄ μ‘΄μ¬νλ€.
1. μ
μμ μΈ ν΄λΌμ΄μΈνΈ
μ μμ μΌλ‘ Class κ°μ²΄λ₯Ό μ λ€λ¦μ΄ μλ νμ μΌλ‘ λκΈ°λ©΄ λ¬Έμ κ° λ°μν μ μλ€.(μ»΄νμΌ μ λΉκ²μ¬ κ²½κ³ λ°μ)
2. μ€μ²΄ν λΆκ° νμ
μ¬μ© λΆκ°
String / String[] μλ μ μ© κ°λ₯νλ List<String> κ°μ μ€μ²΄ν λΆκ° νμ
μ Class κ°μ²΄λ₯Ό μ»μ μ μμ΄ λ¬Έλ² μ€λ₯κ° λλ€.
List.classκ° νμ©λλ€λ©΄, List<Integer>μ List<String>μ΄ κ°μ Class κ°μ²΄λ₯Ό 곡μ νκ² λμ΄ κ΅¬λΆν μ μκ² λκΈ° λλ¬Έμ΄λ€.
(μνΌ νμ
ν ν°μ΄λΌλ λ°©λ²μΌλ‘ μ°ν κ°λ₯ νλ νκ³κ° μ‘΄μ¬νλ€.)
νμ μ νμ
ν ν°(bounded type token)
μμμ ꡬνν Favorites ν΄λμ€λ λΉνμ μ μμΌλμΉ΄λ νμ
μ μ¬μ©νκ³ μκΈ° λλ¬Έμ λͺ¨λ ν΄λμ€λ₯Ό νμ©νλ€.
νΉμ ν΄λμ€λ§ νμ©νκ³ μΆλ€λ©΄ νμ μ νμ
ν ν°μ μ¬μ©νλ©΄ λλ€.(μ΄λ
Έν
μ΄μ
APIμμ νμ μ νμ
ν ν°μ μ¬μ©νκ³ μλ€.)
<T extends Annotation>λ‘ μ μΈνμ¬ μ΄λ
Έν
μ΄μ
νμ
λ§ νμ©νμ¬ μ¬μ©νκ³ μλ€.
μ΄ λ©μλλ₯Ό κ·Έλλ‘ μ¬μ©νλ©΄ ? extends AnnotationμΌλ‘ νλ³ννκ² λμ΄ λΉκ²μ¬ νλ³νμ νκ² λλ―λ‘ μ»΄νμΌ κ²½κ³ κ° λ°μνλ€.
λ€λ₯Έ λ©μλλ₯Ό μΆκ°μ μΌλ‘ μ¬μ©νλ©΄μ νμ μ νμ
ν ν°μ μμ νκ² μ¬μ©νλ λ°©λ²μ λ€μκ³Ό κ°λ€.
Last updated
Was this helpful?