item 33 Jung inchul - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki
Effective Java 3e μμ΄ν 33λ₯Ό μμ½ν λ΄μ© μ λλ€.
μ λ€λ¦μ Set<E>
, Map<K,V>
λ±μ 컬λ μ
κ³Ό ThreadLocal<T>
, AtomicReference<T>
λ±μ λ¨μΌ μμ 컨ν
μ΄λμλ νν μ°μΈλ€. μ컨λ Set
μλ μμμ νμ
μ λ»νλ λ¨ νλμ νμ
맀κ°λ³μλ§ μμΌλ©΄ λλ©°, Map
μλ ν€μ κ°μ νμ
μ λ»νλ 2κ°λ§ νμν μμ΄λ€.
λ°μ΄ν°λ² μ΄μ€μ ν(row)
μ μμ κ°μμ μ΄(column)
μ κ°μ§ μ μλλ°, λͺ¨λ μ΄μ νμ
μμ νκ² μ΄μ©ν μ μλ€λ©΄ λ©μ§ κ²μ΄λ€.
컨ν
μ΄λ
λμ ν€λ₯Ό 맀κ°λ³μνν λ€μ, 컨ν
μ΄λμ κ°μ λ£κ±°λ λΊ λ 맀κ°λ³μν
ν ν€λ₯Ό ν¨κ» μ 곡νλ©΄ λλ€. μ΄λ° μ€κ³ λ°©μμ νμ
μμ μ΄μ’
컨ν
μ΄λ ν¨ν΄
μ΄λΌ νλ€.
public class Favorite{
private Map<Class<?>, Object> Favorite = new HashMap<>();
public <T> void putFavorite(Class<T> type, T instance){
Favorite.put(Objects.requireNonNull(type), instance);
}
public <T> T getFavorite(Class<T> type){
return type.cast(Favorite.get(type));
}
}
public static void main(String[] args) {
Favorite f = new Favorite();
f.putFavorite(String.class, "Java");
f.putFavorite(Integer.class, 0xcafebabe);
f.putFavorite(Class.class, Favorite.class);
String Favoritetring = f.getFavorite(String.class);
int favoriteInteger = f.getFavorite(Integer.class);
Class<?> favoriteClass = f.getFavorite(Class.class);
System.out.printf("%s %x %s\n", Favoritetring, favoriteInteger, favoriteClass.getName());
}
Favorite μΈμ€ν΄μ€λ νμ
μμ νλ€. λ°λΌμ Favoriteλ νμ
μμ μ΄μ’
컨ν
μ΄λ
λΌ ν λ§νλ€.
λΉνμ μ μμΌλμΉ΄λ νμ
μ΄λΌ μ΄ λ§΅ μμ μ무κ²λ λ£μ μ μλ€κ³ μκ°ν μ μμ§λ§, μ¬μ€μ κ·Έ λ°λλ€. μμΌλμΉ΄λ νμ
μ΄ μ€μ²© λμλ€λ μ μ κΉ¨λ¬μμΌ νλ€.
μμΌλ νμ μ΄ μ€μ²©λμλ€λ λ§μ λ¬΄μ¨ λ»μΌκΉ?
μ΄λ λͺ¨λ ν€κ° μλ‘ λ€λ₯Έ 맀κ°λ³μννμ μΌ μ μλ€λ λ»μΌλ‘, 첫 λ²μ§Έλ Class, λ λ²μ§Έλ ClassμμΌλ‘ λ μ μλ€.
-
μ
μμ μΈ ν΄λΌμ΄μΈνΈκ° Class κ°μ²΄λ₯Ό (μ λ€λ¦μ΄ μλ)
λ‘ νμ
(μμ΄ν 26)μΌλ‘ λκΈ°λ©΄ Favorite μΈμ€ν΄μ€μνμ μμ μ±
μ΄ μ½κ² κΉ¨μ§λ€. νμ§λ§ μ΄λ ν΄λΌμ΄μΈνΈ μ½λμμ μ»΄νμΌν λλΉκ²μ¬ κ²½κ³
κ° λ° κ²μ΄λ€.
public class Favorite {
private Map<Class<?>, Object> Favorite = new HashMap<>();
public <T> void putFavorite(Class<T> type, T instance) {
Favorite.put(Objects.requireNonNull(type), type.cast(instance));
}
public <T> T getFavorite(Class<T> type) {
return type.cast(Favorite.get(type));
}
}
Favoriteκ° `νμ
λΆλ³μ`μ μ΄κΈ°λ μΌμ΄ μλλ‘ λ³΄μ₯νλ €λ©΄ `putFavorite` λ©μλμ κ°μ΄ `instance`μ νμ
μ΄ `type`μΌλ‘ λͺ
μν νμ
κ³Ό κ°μμ§ νμΈνλ©΄ λλ€.
`java.util.Collections`μλ `checkedSet`, `checkedList`, `checkedMap` κ°μ λ©μλκ° μλλ° λ°λ‘ μ΄ λ°©μμ μ μ©ν 컬λ μ
λνΌλ€μ΄λ€.
-
Favorite ν΄λμ€μ λ λ²μ§Έ μ μ½μ
μ€μ²΄ν λΆκ° νμ
μλ μ¬μ©ν μ μλ€λ κ²μ΄λ€. λ€μ λ§ν΄, μ¦κ²¨ μ°ΎλString
μ΄λString[]
μ μ μ₯ν μ μμ΄λ μ¦κ²¨ μ°Ύλ Listμ μ μ₯ν μ μλ€.List<String>
μ μ μ₯νλ €λ μ½λλ μ»΄νμΌλμ§ μμ κ²μ΄λ€.List<String>
μ©Class
κ°μ²΄λ₯Ό μ»μ μ μκΈ° λλ¬Έμ΄λ€.List<String>.class
λΌκ³ μ°λ©΄ λ¬Έλ² μ€λ₯κ° λλ€.List<String>
κ³ΌList<Integer>
λList.class
λΌλ κ°μ²΄λ₯Ό 곡μ νκΈ° λλ¬Έμ΄λ€.μ΄λ
νμ μ νμ ν ν°
μ νμ©νλ©΄ κ°λ₯νλ€. νμ μ νμ ν ν°μ΄λ λ¨μν νμ μ νμ 맀κ°λ³μλ νμ μ μμΌλμΉ΄λλ₯Ό μ¬μ©νμ¬ νν κ°λ₯ν νμ μ μ ννλ νμ ν ν°μ΄λ€.μ λν μ΄μ API(μμ΄ν 39)λ νμ μ νμ ν ν°μ μ κ·Ήμ μΌλ‘ μ¬μ©νλ€.
public <T extends Annotation> T getAnnotation(Class<T> annotationType);
μ¬κΈ°μ
annotationType
μΈμλ μ λν μ΄μ νμ μ λ»νλ νμ μ νμ ν ν°μ΄λ€. μ΄ λ©μλλ ν ν°μΌλ‘ λͺ μν νμ μ μλν μ΄μ μ΄ λμ μμμ λ¬λ € μλ€λ©΄ κ·Έ μ λν μ΄μ μ λ°ννκ³ μλ€λ©΄null
μ λ°ννλ€. μ¦, μ λν μ΄μ λ μμλ κ·Έ ν€κ° μ λν μ΄μ νμ μΈ, νμ μμ μ΄μ’ 컨ν μ΄λμ΄λ€.
Class<?>
νμ
μ κ°μ²΄κ° μκ³ , μ΄λ₯Ό (getAnnotation
μ²λΌ) νμ μ νμ
ν ν°μ λ°λ λ©μλμ λκΈ°λ €λ©΄ μ΄λ»κ² ν΄μΌ ν κΉ?
κ°μ²΄λ₯Ό Class<? extends Annotation>
μΌλ‘ νλ³νν μλ μμ§λ§ μ΄ νλ³νμ λΉκ²μ¬
μ΄λ―λ‘ μ»΄νμΌνλ©΄ κ²½κ³ κ° λ¬ κ²μ΄λ€. μ΄ μ’κ²λ Class
ν΄λμ€κ° μ΄λ° νλ³νμ μμ νκ² μνν΄μ£Όλ μΈμ€ν΄μ€ λ©μλλ₯Ό μ 곡νλ€. λ°λ‘ asSubClass
λ©μλλ‘, νΈμΆλ μΈμ€ν΄μ€ μμ μ Class
κ°μ²΄λ₯Ό μΈμκ° λͺ
μν ν΄λμ€λ‘ νλ³ννλ€. (νλ³νλλ€λ κ²μ μ΄ ν΄λμ€κ° μΈμλ‘ λͺ
μν ν΄λμ€μ νμ ν΄λμ€λΌλ λ»μ΄λ€.)
static Annotation getAnnotation(AnnotatedElement element,
String annotationTypeName) {
Class<?> annotationType = null; // λΉνμ μ νμ
ν ν°
try {
annotationType = Class.forName(annotationTypeName);
} catch (Exception ex) {
throw new IllegalArgumentException(ex);
}
return element.getAnnotation(
annotationType.asSubclass(Annotation.class));
}
컬λ μ
API
λ‘ λνλλ μΌλ°μ μΈ μ λ€λ¦ ννμμλ ν 컨ν
μ΄λκ° λ€λ£° μ μλ νμ
맀κ°λ³μ
μ μκ° κ³ μ λμ΄ μλ€. νμ§λ§ 컨ν
μ΄λ μμ²΄κ° μλ ν€λ₯Ό νμ
맀κ°λ³μ
λ‘ λ°κΎΈλ©΄ μ΄λ° μ μ½μ΄ μλ νμ
μμ μ΄μ’
컨ν
μ΄λ
λ₯Ό λ§λ€ μ μλ€. νμ
μμ μ΄μ’
컨ν
μ΄λλ Class
λ₯Ό ν€λ‘ μ°λ©°, μ΄λ° μμΌλ‘ μ°μ΄λ Class
κ°μ²΄λ₯Ό νμ
ν ν°μ΄λΌ νλ€.