이펙티브 자바를 읽다가
static 팩토리 메소드의 네 번쨰 장점 중 하나인, 매개변수화 타입parameterized type의 인스턴스를 생성하는 코드를 간결하게 해준다.
는 내용을 보고, 문득 구글 Guava Library의 Maps, Lists 클래스를 떠올렸다. 아무런 생각없이 무심코 사용하던 녀석들이었는데…
자바에서는 인스턴스를 생성할 때 클래스의 생성자를 호출해주어야 한다.
Map<String, Object> map = new HashMap<String, Object>();
위의 map 인스턴스를 생성하는 코드를 guava 에서는 아래와 같은 형태로 선언하여 사용가능하다.
Map<String, Object> map = Maps.newHashMap()
앞선 기존 방식의 인스턴스에 비해 guava의 Maps를 통해 얻을 수 있는 이점은 <String, Object>
매개변수화 타입을 선언하지 않아도 된다는 것이다. 어떻게 보면 미묘한 차이지만, 번거로운 타이핑을 줄일 수 있다는 것만으로도 큰 이득이다. 아마 Maps.newHashMap() static 메소드는 다음과 같은 형태를 띄고 있을 것이다.
public static <K, V> HashMap<K,V> newHashMap() {
return new HashMap<K, V>();
}
실제코드는 Maps.java - guava-library 에서 살펴볼 수 있는데, 실제코드를 살펴보면
/**
* Creates a <i>mutable</i>, empty {@code HashMap} instance.
*
* <p><b>Note:</b> if mutability is not required, use {@link
* ImmutableMap#of()} instead.
*
* <p><b>Note:</b> if {@code K} is an {@code enum} type, use {@link
* #newEnumMap} instead.
*
* @return a new, empty {@code HashMap}
*/
public static <K, V> HashMap<K, V> newHashMap() {
return new HashMap<K, V>();
}
으로 되어 있는 것을 볼 수 있다. 아직까지 JDK7(HashMap - openjdk 7) 까지도 이런 형태의 static 팩토리 메소드를 가지고 있지 않다. 딱히 나올 것 같아보이지도 않긴 하다. static 팩토리 메소드는 개발자의 몫이니까…
편하게 Guava를 가져다 사용하던가, 필요한 부분만 개발자가 구현해서 사용하던가…
참고
- Google guava
The Guava project contains several of Google’s core libraries that we rely on in our Java-based projects: collections, caching, primitives support, concurrency libraries, common annotations, string processing, I/O, and so forth.
구글에서 제공하는 라이브러리로, 나는 collections 에 대한 처리용도로만 사용을 했었는데… 생각보다 지원하는 기능이 다양하다…!