Java에서 양방향 맵 구현을 찾고 있었고 다음 두 라이브러리를 우연히 발견했습니다.
- Google Guava (이전의 “Google 컬렉션”)
- 아파치 커먼즈 컬렉션
둘 다 무료이며, 내가 찾던 양방향 맵 구현 (아파치의 BidiMap, Google의 BiMap)이 놀랍게도 거의 같은 크기입니다 (Apache 493 kB, Google 499 kB) 모든면에서 나와 비슷합니다.
어느 것을 선택해야하며 왜 그런가요? 다른 대안이 있습니까? (무료 여야하며 최소한 양방향지도가 있어야합니다)? 최신 Java SE를 사용하고 있으므로 인위적으로 Java 5 또는 이와 유사한 것을 제한 할 필요가 없습니다.
답변
내 생각에 더 나은 선택은 구아바 (이전의 Google 컬렉션이라고 함)입니다.
- 더 현대적입니다 (제네릭이 있음)
- Collections API 요구 사항을 절대적으로 따릅니다.
- 적극적으로 유지되고 있습니다
CacheBuilder
전임자MapMaker
는 평범합니다.
Apache Commons Collections도 좋은 라이브러리이지만 제네릭 사용 버전 ( 제 생각에 컬렉션 API 의 주요 단점) 을 제공하지 못 했으며 일반적으로 유지 보수 /하지 말아야 할 것으로 보입니다. 너무 많은 작업을 수행하는 모드 최근 Commons Collections에서 다시 한 번 스팀을 얻었지만 몇 가지를 따라 잡았습니다. .
다운로드 크기 / 메모리 풋 프린트 / 코드 크기가 문제인 경우 Apache Commons Collections는 다른 라이브러리의 일반적인 종속성이므로 더 나은 후보가 될 수 있습니다. 따라서 추가 종속성을 추가하지 않고도 자신의 코드에서도 사용할 수 있습니다. 편집 :이 특정 “이점”은 지금까지 부분적으로 전복되었습니다. 많은 새로운 라이브러리가 실제로 Apache Commons Collections가 아닌 Guava에 의존하기 때문입니다 .
답변
FAQ에서 :
Google 컬렉션 FAQ
대신 Apache Commons Collections를 개선하려고 시도했을 때 Google이 왜이 모든 것을 구축 했습니까?
Apache Commons Collections는 우리의 요구를 충족시키지 못했습니다. 우리는 코드에서 컴파일 경고를 얻는 것을 싫어하기 때문에 제네릭을 사용하지 않습니다. 또한 오랫동안 “보류 패턴”에있었습니다. 우리는 그것을 기꺼이 사용할 때까지 고치려면 상당한 투자가 필요하다는 것을 알 수 있었고 그 동안 우리 도서관은 이미 유기적으로 성장하고있었습니다.
Apache 라이브러리와 우리 라이브러리의 중요한 차이점은 컬렉션이 구현하는 JDK 인터페이스에 지정된 계약을 충실히 준수한다는 것입니다. Apache 문서를 검토하면 수많은 위반 사례를 찾을 수 있습니다. 그들은 이것을 명확하게 지적한 것에 대한 가치가 있지만 표준 수집 행동에서 벗어나는 것은 위험합니다! 그러한 컬렉션으로 무엇을하는지주의해야합니다. 버그는 항상 일어나기를 기다리고 있습니다.
우리의 컬렉션은 완전히 생성되며 계약을 위반하지 않습니다 (JDK 구현이 수용 가능한 위반에 대한 강력한 선례를 설정 한 격리 된 예외는 제외). 즉, 컬렉션을 기대하는 모든 방법으로 컬렉션 중 하나를 전달할 수 있으며 원하는대로 작동 할 것이라고 확신합니다.
답변
내가 찾은 가장 중요한 것은 Google 컬렉션을 시작하기위한 장소로 만듭니다.
- 제네릭 (제네릭이없는 컬렉션-FTL)
- Collections 프레임 워크와의 일관성 (Josh Bloch는이 프레임 워크의 핵심 플레이어였습니다)
- 단정. 이 사람들은이 문제를 바로 잡는 데 필사적으로 묶여 있습니다. 그들은 25K 단위 테스트와 같은 것을 가지고 있으며 API를 올바르게 얻는 것과 관련이 있습니다.
다음 은 주요 저자가 제공 한 대화에 관한 유튜브 비디오 입니다. 그는이 라이브러리에 대해 알아야 할 가치가있는 것에 대해 잘 설명하고 있습니다.
답변
다른 두 가지 (내가 틀리지 않기를 바랍니다)
- Guava (Google 컬렉션의 새로운 이름) 라이센스는 Apache License 2.0이며 이는 Apache Commons 프로젝트와 동일합니다.
- 다운로드 할 파일에서 Guava의 소스 코드를 찾을 수 없습니다 (git-access 만 가능함)
답변
Guava에 대한 한 가지 나쁜 점은 멀티 맵이 java.util.Map을 확장하지 않는다는 것입니다. 맵에서 작동하는 고유 한 메소드가있는 경우 Guava 멀티 맵에서 작동하지 않습니다 (Apache MultiMap 인터페이스는 java.util.Map을 확장 함). 나는 그것이 왜 그런지에 대한 좋은 이유가 있다고 확신하지만 또한 불편합니다.