미래학자
[JAVA] Effective Java - 01 정적 팩토리 메서드 사용하기 본문
Java를 배울 때 객체 지향의 특성을 제대로 이해하지 않은 상태로 몇 년이 지났다.
학교에서 열심히 배우지 않은 탓에 늦게 나마 제대로 공부 하고 싶어서 Java 공부를
다시 시작했다.
사실, 이전에 Head First 에서 나온 JAVA 책을 보았다. 그 책은 초보자가 보기에 좋은
책이고 객체지향의 개념을 간단히 알려준다.
반면, Effective Java는 초보자용이 아닌 책이고, 살짝 보기에 디자인 패턴 내용도 보이는게
제목 그대로 효율적인 자바를 사용하는 방법에 대해 알려주는 것 같다. 이러한 것들은
좋은 코드에 적용되는 스킬이라고 볼 수도 있는데, 좋은 코드를 많이 보는 것이 좋긴 하지만
이 책과 같이 한 번에 잘 정리해주는 것도 참 좋은 것 같다.
아래 블로그는 책 내용을 잘 정리 해 주신 황군'stroy 블로그를 소개 한다.
이 책을 읽으면서 잘 몰랐던 개념들을 독백 형식으로 포스트 했다.
메서드 시그너처(signature)
오버로딩하게 하도록 도와주는데.
함수의 이름, 변수의 개수, 타입, 순서를 묶어서 시그너처라 한다.
정적 팩터리 메서드.
잘 사용하면 생성자 보다 좀 더 유용하게 사용할 수 있다.
원한다면 현재 객체를 캐시에 저장하여 다른 객체를 가져올 수 있고,
객체 생성이 불필요한 문제를 해결 할 수 있다. 또 객체의 개수를 제어할 수 있다. 또, 반환 값이 더 자유롭다. (하위 클래스를 반환할 수 있음)
// 서비스 제공자 인터페이스 대략적인 모습
// 서비스 인터페이스
public interface Service {
....... // 서비스에 고유한 메서드들이 이 자리에 온다.
}
// 서비스 제공자 인터페이스
public interface Provider {
Service newService();
}
// 서비스 등록과 접근에 사용되는 객체 생성 불가능 클래스
public class Services {
private Services() {} // 객체 생성 방지 (규칙 4)
// 서비스 이름과 서비스 간 대응관계 보관
private static final Map<String, Provider> Providers =
new ConcurrentHashMap<String, Provider>();
public static final String DEFAULT_PROVIDER_NAME = "<def>";
//제공자 등록 API
public static void registerDefaultProvider(Provider p) {
registerDefaultProvider(DEFAULT_PROVIDER_NAME, p);
}
public static void registerDefaultProvider(String name, Provider p) {
Providers.put(name, p);
}
// 서비스 접근 API
public static Service newInstance() {
return newInstance(DEFAULT_PROVIDER_NAME);
}
public static Service newInstance(String name) {
Provider p = Providers.get(name);
if (p == null) {
throw new IllegalArgumentException("No provider register with name: " + name);
}
return p.newService();
}
}
'JAVA' 카테고리의 다른 글
리플렉션 개념 익히기 (1) | 2017.01.03 |
---|---|
자바 동적로딩 이해(델리게이션 모델) (2) | 2017.01.03 |
자바 동작 이해 (0) | 2016.12.23 |
Effective Java - 02 Builder 패턴 (0) | 2016.02.29 |
Comments