클래스와 인터페이스.

클래스와 인터페이스에서는 추상화의 기본 단위인 클래스와 인터페이스를 쓰기 편하고, 견고하며, 유연하게 만드는 방법을 안내합니다.

아이템 15. 클래스와 멤버의 접근 권한을 최소화하라

자바에서 캡슐화시 주의점

아이템 16. public 클래스에서는 public 필드가 아닌 접근자 메서드를 사용하라

아이템 17. 변경 가능성을 최소화하라

아이템 18. 상속보다는 컴포지션을 사용하라

public class InstrumentedHashSet<E> extends HashSet<E> {
  ...
}

상속이 아닌 컴포지션

public class InstrumentedSet<E> extends ForwardingSet<E> {
  ...
}

public class ForwardingSet<E> implements Set<E> {
  ...
}
Set<Instant> times = new InstrumentedSet<>(new TreeSet<>(cmp));
Set<E> s = new InstrumentedSet<>(new HashSet<>(INIT_CAPACITY));

아이템 19. 상속을 고려해 설계하고 문서화하라. 그러지 않았다면 상속을 금지하라

아이템 20. 추상 클래스보다는 인터페이스를 우선하라

아이템 21. 인터페이스는 구현하는 쪽을 생각해 설계하라

아이템 22. 인터페이스는 타입을 정의하는 용도로만 사용하라

public interface MathConstants {
    static final double PI = 3.14;
}

아이템 23. 태그 달린 클래스보다는 클래스 계층구조를 활용하라

class Figure {
  enum Shape { RECTANGE, CIRCLE} ;
  double length;
  double width;

  double radius;
}

태그 기반 표현의 단점

클래스 계층구조를 이용

abstract class Figure {...}

class Circle extends Figure {
  double radius;
  ...
}

class Rectangle extends Figure {
  double length;
  double width;
  ...
}

아이템 24. 멤버 클래스는 되도록 static으로 만들라

정적 멤버 클래스

비정적 멤버 클래스

익명 클래스

지역 클래스

아이템 25. 톱레벨 클래스는 한 파일에 하나만 담으라