Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- Android P
- Rxjava2
- NDK
- livedata
- Python
- flutter firestore
- Java
- Android
- android push
- UWP
- 알고리즘
- kodility
- 안드로이드
- 안드로이드 구글맵
- FLUTTER
- Django REST framework
- C
- C++
- Django REST Android
- C/C++
- RxJava
- 프로그래머스
- mfc
- dart
- 코틀린
- RxAndroid
- android architecture component
- Flutter TextField
- Kotlin
- Django REST
Archives
- Today
- Total
개발하는 두더지
[Effective Java 규칙29] 형 안전 다형성 컨테이너를 쓰면 어떨지 따져보라 본문
[Effective Java 규칙29] 형 안전 다형성 컨테이너를 쓰면 어떨지 따져보라
Effective Java 2/E 책과 구글링을 통해 내용을 정리하고 개인적인 견해가 포함된 글입니다.
제네릭을 이용하여 Set이나 Map같은 컬렉션(Collections)을 만들 때 키 값을 Class 객체로 사용하면 형 안전 다형성 컨테이너를 만들 수 있다.
형 안전성을 깨뜨리지 않으면서 각 인덱스에 접근하여 서로 다른 자료형의 값을 받아올 수 있다.
예를들어, 임의 클래스 객체를 골라 저장하고 꺼낼 수 있는 클래스가 있다고 하자. 키는 Class 객체가 된다. 형인자 T가 키를 의미한다는 것을 제외하면 간단한 Map과 같아 보인다. 이 API를 사용하는 클라이언트는 객체를 넣거나 꺼낼 때 그 클래스 객체를 함께 전달하면 된다.
class Favorites {
private Map<Class<?>, Object> favorites = new HashMap<>();
public <T> void putFavorite(Class<T> type, T instance) {
favorites.put(type, type.cast(instance));
}
public <T> T getFavorite(Class<T> type) {
return type.cast(favorites.get(type));
}
}
cast 메서드는 같은 자료형인 경우 값을 그대로 리턴하고, 자료형이 다를 경우 ClassCastException이 나옵니다. 즉, 키와 값이 같은 타입일 경우에만 Map에 저장됩니다.
public static void main(String[] args) {
Favorites f = new Favorites();
f.putFavorite(String.class, "JAVA");
f.putFavorite(Integer.class, 15);
f.putFavorite(Class.class, Favorites.class);
String test1 = f.getFavorite(String.class);
Integer test2 = f.getFavorite(Integer.class);
Class<?> test3 = f.getFavorite(Class.class);
System.out.println(String.format("%s, %d, %s", test1, test2, test3.getName()));
}
서로 다른 클래스 객체를 저장하고 꺼내볼 수 있습니다.
'Java,Android' 카테고리의 다른 글
[Effective Java 규칙31] enum ordinal 대신 객체 필드를 사용하라 (0) | 2018.10.12 |
---|---|
[Effective Java 규칙30] int 상수 대신 enum을 사용하라 (0) | 2018.10.08 |
[Effective Java 규칙28] 한정적 와일드카드를 써서 API 유연성을 높여라 (0) | 2018.10.05 |
[Effective Java 규칙27] 가능하면 제네릭 메서드으로 만들 것 (0) | 2018.10.04 |
[Effective Java 규칙26] 가능하면 제네릭 자료형으로 만들 것 (0) | 2018.10.04 |
Comments