내 말은, 사실상 불변 객체가 존재하는 이유는 무엇입니까? 최종 정적 수정 자만 사용하지 않는 이유는 무엇입니까? Java가 변경 불가능하게 만드는 String에 대해 중요한 것은 무엇입니까?
변수를 final로 설정하면 해당 참조를 변경할 수 없습니다. 그러나 참조가 가리키는 객체는 여전히 변경 될 수 있으므로 정의하면 다음과 같습니다.
final List<String> list = new ArrayList<String>();
목록을 다른 목록으로 바꿀 수는 없지만 목록의 내용은 계속 수정할 수 있습니다.
list.add("asdf");
그러나 불변 객체는 일단 생성되면 변경할 수 없습니다.
(정적 만 사용한다는 것은 필드가 인스턴스가 아니라 클래스에서 정의된다는 것을 의미합니다. 상수 값을 정의하는 데 사용되지만 (더욱 열거 형이 추가되기 전에) 클래스에 하나의 값만 필요하기 때문에 만 사용됩니다. 정적 키워드는 다음과 직접 관련이 없습니다. 불변성.)
불변 객체는 스레드로부터 안전하며 객체의 상태가 생성시 안전하게 게시되기 때문에 메모리 가시성, 손실 된 업데이트 등에 대한 우려는 적용되지 않습니다.
상태 변경이 없기 때문에 추론하기 쉽습니다. 가치 기반 평등을 가진 사물의 경우 불변성이 설명되는 개념과 더 잘 일치합니다. 변하지 않는 추상화 인 문자열과 숫자의 경우 불변성이 특히 적절합니다.
변경 가능한 필드가 equals 및 hashCode 구현에 참여하는 변경 가능한 객체가있는 경우 컬렉션에 넣은 다음 필드를 변경하여 컬렉션 작동 방식을 깨는 상황이 발생할 수 있습니다. 그런 종류의 것을 미리 피하는 것이 좋습니다.
또한 불변 객체는 공유하기에 더 안전합니다. Java Concurrency in Practice , 3.4를 참조하십시오 .
변경 불가능한 객체도 더 안전합니다. 신뢰할 수없는 코드에 변경 가능한 개체를 전달하거나 신뢰할 수없는 코드가 찾을 수있는 곳에 게시하는 것은 위험합니다. 신뢰할 수없는 코드는 상태를 수정하거나 더 나쁜 경우에는 참조를 유지하고 나중에 다른 스레드에서 상태를 수정할 수 있습니다. 반면에 변경 불가능한 개체는 악성 코드 나 버그가있는 코드에 의해 이러한 방식으로 전복 될 수 없으므로 방어적인 복사본을 만들 필요없이 자유롭게 공유하고 게시 할 수 있습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다