한 줄 요약: 제목이 곧 내용이다.
Class instance = new Class(); 대신 Interface instance = new Class();를 사용해라.
인터페이스를 타입으로 사용하는 습관을 길러두면 프로그램이 훨씬 유연해진다.
나중에 구현 클래스를 교체하고자 할 때, 새 클래스의 생성자 or 정적 팩토리 메소드를 호출하면 된다.
ex. Set<Son> sonSet = new LinkedHashSet<>(); → Set<Son> sonSet = new HashSet<>();
적합한 인터페이스가 없다면 당연히 클래스를 참조해야 한다.
String이나 BigInteger 같은 Value 클래스는 당연히 여러 가지로 구현될 수 있다는 가정하에 설계하지 않는다.
그렇기 때문에 final인 경우가 많기도 하다.
이런 경우가 아니라면, 그래도 최대한 해당 클래스의 계층구조 중 필요한 기능을 만족하는 가장 덜 구체적인 클래스를 타입으로 사용하는 것이 적절하다.
내 생각에 예외인 상황
Item 37의 ordinal 인덱싱 대신 EnumMap을 사용하라 챕터에서 소개된 EnumMap의 경우에는 타입이 Map인 클래스이기는 하지만, Enum 인덱싱을 위한 특수 목적으로 사용되는 클래스이다.
이 목적으로 사용되는 경우라면, Map 대신 EnumMap으로 명시적으로 나타내는 것이 오히려 코드를 작성한 의도가 더 잘 드러나지 않을까 싶다..!
