2014년 2월 13일 목요일

[Effective JAVA] 13. 불변클래스를 써라.

1. 객체를 변경하는 메소드를 제공하지 않는다.
setter금지

2. 재정의 할 수 있는 메소드를 제공하지 않는다.
- 클래스를 final로 재정의해서 상속 자체를 원천 봉쇄한다.
- 모든 메소드를 final로 정의한다.
- 생성자를 private이나 package-private으로 정의하고 public static 팩토리 메소드를 제공한다. (생성자가 private인 경우 상속이 불가능하다. 하지만 package-private으로 작성하면 같은 package내에서는 상속이 가능하다. 원하는 인스턴스를 골라서 리턴할 수도 있다.)

3. 모든 필드를 final로 만든다.

4. 모든 필드를 private으로 만든다. 
Q: 기본 타입이나 불변 객체를 참조하는 public final 필드를 불변 클래스에 둘 수는 있지만, 향후 배포판에서 클래스의 내부 표현을 바꿀 수 없기 때문에 바람직하지 않다.?

5. 가변 객체를 참조하는 필드는 배타적으로 접근해야 한다.(ex 방어복사)
클라이언트가 이 객체에 대한 참조를 얻을 수 없게 해야 한다. 해당 필드를 final로 선언했다 할지라도 해당 필드가 어떤 객체를 참조하는가 하는 사실만 불변(final)이지 참조하는 객체의 내부는 변경할 수 있기 때문이다.

* 방어복사 : 객체를 복사할 때 객체의 참조를 리턴하는 것이 아니라 객체의 복사본을 리턴하는 등의 방법을 통해 객체를 복사하는 방법.

댓글 없음:

댓글 쓰기