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