<Effective Java> RULE 15 변경 가능성을 최소화 하라
변경 불가능 클래스는 그 객체를 수정할 수 없는 클래스이다.
객체 내부정보는 객체가 생성될 때 주어진 것이며 객체가 살아있는 동안 그대로 보존된다.
→ String
→ BigInteger
→ BigDecimal..
변경불가능 클래스를 만들때 5가지 규칙
1. 객체 상태를 변경하는 메서드(수정자 메서드 등)을 제공하지 않는다.
2. 계승할 수 없도록 한다.
3. 모든 필드를 final로 선언한다.
→ 새로 생성된 객체에 대한 참조가 동기화없이 다른 스레드로 전달되어도 안전하다.
4. 모든 필드를 private로 선언한다.
→ 클라이언트가 필드가 참조하는 변경 가능 객체를 직접 수정하는일을 막을 수 있다.
5. 변경 가능 컴포넌트에 대한 독점적 접근권을 보장한다.
→ 클래스에 포함된 변경 가능 객체에 대한 참조를 클라이언트는 획득할 수 없도록 해야 한다.
변경 불가능 클래스는 자주 사용되는 객체를 캐시하여 이미있는 객체가 거듭 생성되지 않게 하는 정적 팩토리를 제공할 수 있다.
장점
1. 객체 내부도 공유할 수 있다.
→ BigInteger클래스는 값의 부호와 크기를 각각 int변수와 int배열로 표현
→ negate메서드는 같은 크기의 값을 부호만 바꿔서 새로운 BigInteger객체로 반환
→ 배열을 복사하지 않는다.
→ 새로운 BigInteger객체도 원래 객체와 같은 내부 배열을 참조
2. 다른 객체의 구성요소로도 훌륭하다.
→ 한번 집어넣고 나면 그 값이 변경되어 맵이나 집합의 불변식이 깨질 걱정이 없다.
단점
1. 값마다 별도의 객체를 만들어야 한다는 점
→ 객체 생성비용이 클때 단점 부각