문제
Java의 문자열 클래스와 마찬가지로 불변의 수업을 구축하는 효율적인 방법을 찾고 있습니다.
해결책
- 모든 필드는 있어야합니다
private
그리고 바람직하게는final
- 클래스가 무시할 수 없는지 확인 - 수업을 최종적으로 만들거나 정적 공장을 사용하고 생성자를 비공개로 유지하십시오.
- 필드는 생성자/공장에서 채워져 있어야합니다
- 필드에 대한 세터를 제공하지 마십시오
- 컬렉션을 조심하십시오. 사용
Collections.unmodifiable*
. 또한 컬렉션에는 불변의 물체 만 포함되어야합니다 - 모든 getters는 불변의 물건이나 사용을 제공해야합니다 방어 복사
- 객체의 내부 상태를 변경하는 방법을 제공하지 마십시오.
Tom Hawtin 그것을 지적했다 final
선택 사항이 될 수 있습니다. String
class
캐시가 있습니다 hash
해시 함수가 호출 될 때만 할당됩니다.
다른 팁
생성자를 사용하여 모든 필드를 채우고 필드를 최종적으로 만드는 경우 - 당신은 그곳에 있습니다.
필드가 사용자 정의 유형을 사용하는 경우에도 불변을 만들어야 할 수도 있습니다.
컬렉션 인 모든 필드는 수정할 수없는 컬렉션을 사용하여 안전한쪽에 있어야합니다.
객체 그래프에 대해 걱정해야합니다!
물체의 모든 방법은 비 결절 필드를 돌봐야합니다. 예를 들어 String.add를 생성합니다 새로운 끈. 하나의 필드를 돌연변이 해야하는 경우 - 사본 생성자를 통해 그렇게하십시오.
마지막으로 객체를 최종적으로 만듭니다.
제휴하지 않습니다 StackOverflow