Java 팀은 Java 8의 기능적 프로그래밍에 대한 장벽을 제거하면서 엄청난 노력을 기울였습니다. 특히, java.util Collections의 변경은 변환을 매우 빠른 스트리밍 작업으로 체인화하는 데 큰 도움이됩니다. 컬렉션에 퍼스트 클래스 함수와 함수 메소드를 추가하는 일이 얼마나 좋은지 고려할 때 왜 불변 컬렉션이나 불변 컬렉션 인터페이스를 제공하지 못한 것일까 요?
기존 코드를 변경하지 않고 Java 팀은 언제든지 변경 가능한 인터페이스와 동일한 변경 불가능한 인터페이스를 추가하고 "set"메소드를 빼고 기존 인터페이스를 다음과 같이 확장 할 수 있습니다.
ImmutableIterable
____________/ |
/ |
Iterable ImmutableCollection
| _______/ / \ \___________
| / / \ \
Collection ImmutableList ImmutableSet ImmutableMap ...
\ \ \_________|______________|__________ |
\ \___________|____________ | \ |
\___________ | \ | \ |
List Set Map ...
물론 List.add () 및 Map.put ()과 같은 작업은 현재 주어진 키에 대해 부울 값 또는 이전 값을 반환하여 작업의 성공 또는 실패 여부를 나타냅니다. 변경 불가능한 콜렉션은 팩토리와 같은 메소드를 처리하고 추가 된 요소 (현재 서명과 호환되지 않는)가 포함 된 새 콜렉션을 리턴해야합니다. 그러나 ImmutableList.append () 또는 .addAt () 및 ImmutableMap.putEntry ()와 같은 다른 메소드 이름을 사용하면 문제를 해결할 수 있습니다. 불변의 컬렉션으로 작업하는 것의 이점에 의해, 그 결과의 자세한 표시가 그 이상이되고, 타입 시스템은 잘못된 메소드 호출의 에러를 방지합니다. 시간이 지남에 따라 이전 방법은 더 이상 사용되지 않을 수 있습니다.
불변 컬렉션의 승리 :
- 단순성-기본 데이터가 변경되지 않은 경우 코드에 대한 추론이 더 간단합니다.
- 문서화-메소드가 변경 불가능한 콜렉션 인터페이스를 사용하는 경우 메소드가 해당 콜렉션을 수정하지 않을 것임을 알고 있습니다. 메소드가 변경 불가능한 콜렉션을 리턴하면 수정할 수 없음을 알고 있습니다.
- 동시성-불변 컬렉션은 스레드간에 안전하게 공유 할 수 있습니다.
불변성을 가정 한 언어를 맛본 사람이라면 서부로 거센 돌연변이로 돌아 가기가 매우 어렵습니다. Clojure의 컬렉션 (시퀀스 추상화)에는 Java 8 컬렉션이 제공하는 모든 기능과 불변성 (스트림 대신 동기화 된 링크 목록으로 인해 추가 메모리와 시간을 사용하더라도)이 이미 있습니다. 스칼라는 전체 작업 세트로 변경 가능하고 변경 불가능한 컬렉션을 모두 가지고 있으며, 이러한 작업이 열성적이지만 .iterator를 호출하면 게으른 견해를 갖게됩니다 (게으르게 평가하는 다른 방법이 있습니다). 불변의 컬렉션없이 Java가 어떻게 계속 경쟁 할 수 있는지 모르겠습니다.
누군가 내가 이것에 대한 역사 나 토론을 지적 할 수 있습니까? 분명히 어딘가에 공개됩니다.
const
컬렉션
Collections.unmodifiable*()
입니다. 그러나 그들이 불변 인 것으로 이것을 불변 인 것으로 취급하지 마십시오
ImmutableList
해당 다이어그램에서 함수가를 사용하면 사람들은 가변 List
? 아니요, LSP를 매우 잘못 위반 한 것입니다.