반응형
[Effective Java] 15. 가변성을 최소화하자.
불변(immutable) 클래스는 자신의 인스턴스가 갖는 값을 변경할 수 없는 클래스이다. 각 인스턴스가 갖는 모든 정보는 그것이 생성될 때 제공되며 객체로 살아있는동안 변경되지 않는다. 자바의 불변 클래스는 String, 박스화 기본형(boxed primitive) 클래스, BigInteger, BigDecimal 등등이 있다.
불변 클래스는 가변 클래스에 비해 설계와 구현 및 사용이 더 쉽다. 또한 에러 발생이 적으며 보안이나 사용 측변에서 더 안전하다.
불변 클래스 만들때 다섯 가지 규칙
1) 객체의 상태를 변경하는 그 어떤 메소드(변경자라고 하는)도 제공하지 않는다.
2) 상속을 할 수 없도록 하자. 일반적으로는 클래스를 final로 지정하면 상속을 막을 수 있다.
3) 모든 필드를 final로 지정한다. 새로 생성된 불변 클래스 인스턴스의 참조가 스레드간의 동기화를 하지 않고 하나의 스레드에서
다른 스레드로 확실하게 전달되도록 하는데도 필요하다.
4) 모든 필드를 private으로 지정한다. 필드로 참조되는 가변 객체를 클라이언트가 직접 접근하여 객체의 내용을 변경하는 것을 막기위함이다. 불변 클래스의 public final필드에서 기본형 데이터 값이나 불변 객체의 참조를 갖는 것이 기술적으로는 가능하다. 그러나 향후에 그 클래스의 내부 구조를 변경하기 어렵기 때문에 바람직하지 않다.
5) 가변 컴포넌트의 직접적인 외부 접근을 막자. 만일 가변 객체를 참조하는 필드가 클래스에 있다면, 그 클래스의 클라이언트가 해당 가변 객체의 참조를 획득할 수 없게 하자. 즉, 클라이언트가 주는 객체 참조로 그런 필드를 초기화해서는 절대 안되며, 접근자 메소드에서 객체 참조를 반환해도 안된다. 그대신 생성자와 접근자 메소드 및 readObject메소드에서 해당 객체의 방어 복사본(defensive copy)을 만들어 사용하도록 하자.
반응형
'backend > Java' 카테고리의 다른 글
[Java] Java Iterator를 Java Stream 으로 변환하기 (1) | 2018.09.07 |
---|---|
throw new UnsupportedOperationException() (4) | 2009.10.30 |
[Effective Java] 23. 새로 작성하는 코드에서는 원천(raw) 타입을 사용하지 말자. (0) | 2009.10.30 |
[Effective Java] 19. 타입을 정의할 때만 인터페이스를 사용하자. (2) | 2009.10.27 |
[Effective Java] 11. clone 메소드는 신중하게 오버라이드 하자. (2) | 2009.10.15 |
[Effective Java] 9. equals 메소드를 오버라이드 할 땐 hashCode 메소드도 항상 오버라이드 하자. (0) | 2009.09.28 |
[Effective Java] 8. equals 메소드를 오버라이딩 할 때는 보편적 계약을 따르자. (4) | 2009.09.24 |
[Effective Java] 5. 불필요한 객체 생성을 피하자 (4) | 2009.09.23 |