참조: Effective Java 2nd Edition. Item 20: Use function objects to represent strategies


자바는 함수 포인터를 제공하지 않는다. 하지만 객체 레퍼러스를 함수 객체와 비슷하게 사용할 수 있다. 

메서드를 호출하면 해당 객체에 대한 기능을 수행하는 것이고 함수 객체는 다른 객체들에서 해당 기능을 수행하게 해준다.

(사족. 메서드는 특정 객체에 종속적인 것이고, 함수 객체는 독립적으로 여러 다른 객체에서 사용할 수 있는 것으로 구분할 수 있겠다.)

함수 객체들은 Concrete Stratege 역할을 하기 때문에 보통 상태 정보가 없고(stateless), 어디서나 동일하게 동작하기 때문에 불필요한 객체 생성 비용을 줄이기 위해 싱글톤으로 사용되기 좋다.

(사족. 스프링을 사용한다면 굳이 싱글톤 구현하느라 애쓰지 말고 그냥 싱글톤 스코프 빈으로 등록하면 되겠다.)

대표적인 예로 Comparator 인터페이스 구현체들이 있다.

// Strategy interface
public interface Comparator<T> {
    public int compare(T t1, T t2);
}
이 구현체는 종종 익명 클래스로 사용되기도 한다. 하지만 익명 클래스를 사용하면 매번 새로운 인스턴스를 만들게 된다. 반복해서 사용할 꺼라면 차라리 함수 객체를 priate static final field에 저장해 놓고 재사용하는 것이 좋겠다. 그렇게 하면 명시적인 이름을 줄수도 있다.
전략이 여러개를 제공하는 "Host class"에서 외부로 공개할( public static final) strategy의 반환 타입은 Strategey 인터페이스 타입이어야 하고 구체적인 Stategy 구현체들은 굳이 public 일 필요가 없다. 
요약
- 전략 패턴을 구현할 때 함수 객체를 주로 사용한다.
- 자바에서 이 패턴을 구현할 때는 전략 인터페이스를 만들고, 각 전략들은 그 인터페이스의 구현체로 만든다.
- 만약 어떤 전략을 한번만 사용할 거면 익명 클래스로 만들고 반복해서 사용할거면 prviate static member 클래스로 만든 다음 전략 인터페이스의 public sttic final field로 제공해준다.
- 대표적인 클래스 String