Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
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
Archives
Today
Total
관리 메뉴

미래학자

[JAVA] Effective Java - 01 정적 팩토리 메서드 사용하기 본문

JAVA

[JAVA] Effective Java - 01 정적 팩토리 메서드 사용하기

미래학자 2016. 2. 26. 16:08
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