728x90

불변클래스란 인스턴스의 내부 값을 수정할 수 없는 클래스

클래스를 불변으로 만드는 다섯가지 규칙

  • 객체의 상태를 변경하는 메서드(변경자)를 제공하지 않는다.
  • 클래스를 확장할 수 없도록 한다.
  • 모든 필드를  final 로 선언한다. 
  • 모든 필드를 private 로 선언
  • 자신 외에는 내부의 가변 컴포넌트에 접근할 수 없도록 한다.

 

728x90
728x90

public 클래스는 절대 가변 필드를 직접 노출해서는 안된다. 불변 필드라면 노출해도 덜 위험하지만 완전히 안심 할 수는 없다. 

하지만 package-private 클래스나 private  중 첩 클래스에서는 종종 (불변이든 가변이든) 필드를 노출하는 편이 나을 때도 있다.

728x90
728x90

프로그램 요소의 접근성은 가능한 한 최소한으로 하라.

꼭 필요한 것만 골라 최소한의 public API를 설계하자.  그외에는 클래스, 인터페이스, 멤버가 의도치 않게 API로 공개 되는 일이 없도록 해야 한다. public 클래스는 상수용 public static final 필드 외에는 어떠한 public 필드도 가져서는 안된다. public static final 필드가 참조하는 객체가 불변인지 확인하라.

728x90
728x90

CompareTo - 이 객체와 주어진 객체의 순서를 비교.  주어진 객체보다 작으면 음의정수를 같으면 0, 크면 양의 정수 반환

비교할수 없는 타입의 객체가 주어지면 ClassCastException 던진다.

 

순서를 고려해야 하는 값 클래스를 작성한다면 꼭 Comparable 인터페이스를 구현하여, 그 인스턴스들을 쉽게 정렬하고, 검색하고, 비교 기능을 제공하는 컬렉션과 어우러지도록 해야 한다. comparabTo 메서드에서 필드의 값을 비교할 때 '<' 와 '>'연사자는 쓰지 말아야한다.  그 대신 박싱된 기본 타입 클래스가 제공하는 정적 compare메서드나 Comparator 인터페이스가 제공하는 비교자 생성 메서드를 사용하자.

728x90
728x90

CLoneable이 몰고 온 모든 문제를 되짚어봤을때, 새로운 인터페이스를 만들때는 절대 Cloneable을 확장해서는 안되며, 새로운 클래스도 이를 구현해서는 안된다. finbal 클래스라면 cloneable을 구현해도 위험이 크지 않지만, 성능 최적화 관점에서 검토한 후 별다른 문제가 없을 때만 드물게 허용해야 한다. 기본 워칙은 '복제 기능은 생성자와 팩터리를 이용하느게 최고' 라는 것이다. 단 배열만은 clone 메서드 방식이 가장 깔끔한, 이규칙의 합당한 예외라 할 수 있다.

728x90
728x90

모든 구체 클래스에서 Object의 toStgring을 재정의하자. 상위 클래스에서 이미 알맞게 재정의한 경우는 예외다. toString을  재정의한 클래스는 사용하기도 즐겁고 그 클래스를 사용한 시스템을 디버깅하기 쉽게 해준다. toString은 해당 객체에 관한 명확하고 유용한 정보를 읽기 좋은 형태로 반환해야 한다.

728x90

+ Recent posts