불변 인스턴스에 간직된 정보는 고정되어 객체가 파괴되는 순간까지 절대 달라지지 않는다.
불변을 만드는 다섯 가지 규칙
1) 객체의 상태를 변경하는 메소드를 제공하지 않는다.
2) 클래스를 확장할 수 없도록 한다. ( 클래스를 final로 선언 , 생성자 private 선언 후 정적 팩토리 메소드 제공 )
3) 모든 필드를 final로 선언한다. ( 런타임 중 변경 X )
4) 모든 필드를 private로 선언한다. ( 외부에서 접근 불가능 )
5) 클래스가 가변객체를 참조한다면 외부 클라이언트가 해당 가변 객체의 참조를 얻을 수 없도록 해야한다.
불변객체는 생성된 시점의 상태를 파괴 될 때까지 유지한다. 불변객체는 스레드에 안전하여 동기화가 필요없다. 여러 스레드가 동시에 사용해도 훼손되지 않는다.
1) 불변객체는 중복생성을 방지할 수 있다.
2) 불변객체는 자유롭게 공유 가능하여 방어적 복사도 필요 없다.
3) 불변객체는 다른 객체의 구성요소로 사용하면 이점이 많다. ( map의 키, set의 원소 )
단점으로는 값이 조금이라도 다르면 독립된 객체를 만들어야 한다.
불변인 객체를 수정해야 하는 상황이 있을 수 있다. 이런 경우 같은 package 안에 가변 동반 클래스를 만들어 사용한다. 대표적으로 StringBuffer, StringBuilder가 있다. String은 대표적인 불변객체이다. 그러므로 문자열을 조작해야 하는 경우 값이 조금이라도 바뀌므로 계속하여 객체가 생성되게 된다. 이를 지원해줄 객체가 바로 가변 동반 클래스이다.
그러므로 불변객체를 수정해야 할 상황이 있다면 가변동반클래스를 새로 만들어 사용하자.
setter를 무분별하게 만들지 않고 단순한 값객체를 항상 불변으로 만들면 된다.
'Dev > JAVA' 카테고리의 다른 글
[Effective JAVA] 추상클래스보다는 인터페이스를 우선하라 (아이템20) (0) | 2024.03.21 |
---|---|
[Effective JAVA] 상속보다는 컴포지션을 사용하라. ( 아이템 18 ) (0) | 2024.03.21 |
[Effective JAVA] 클래스와 멤버의 접근권한을 최소화하라. ( 아이템15 ) (0) | 2024.03.20 |
[Effective JAVA] 불필요한 객체 생성을 피하라 ( 아이템6 ) (0) | 2024.03.20 |
[Effective JAVA] 자원을 직접 명시하지 말고 의존객체 주입을 사용하라. ( 아이템5 ) (0) | 2024.03.20 |